Dòng lệnh grep đệ quy Windows


204

Tôi cần phải thực hiện một grep đệ quy trong Windows, một cái gì đó như thế này trong Unix / Linux:

grep -i 'string' `find . -print`

hoặc phương pháp được ưu tiên hơn:

find . -print | xargs grep -i 'string'

Tôi bị mắc kẹt với chỉ cmd.exe, vì vậy tôi chỉ có các lệnh tích hợp trong Windows. Tôi không thể cài đặt Cygwin hoặc bất kỳ công cụ của bên thứ 3 nào như UnxUtils trên máy chủ này. Tôi thậm chí không chắc mình có thể cài đặt PowerShell. Bạn có đề xuất nào chỉ sử dụng cmd.exe tích hợp (Windows 2003 Server) không?


Đó là khó khăn mà không có quyền hạn, tại sao bạn không thể cài đặt?
Chris Ballance

Quản trị viên hệ thống đang khóa quyền trên máy chủ của chúng tôi. Nếu bất cứ ai có bất kỳ đề xuất quyền hạn nào, hãy loại bỏ chúng và tôi sẽ xem liệu chúng tôi có thể cài đặt PowerShell không.
Andy White

3
btw, tôi thấy rằng trong linux tốt hơn nên viết: "find. | xargs grep -i chuỗi". Sự khác biệt là nếu find trả về một danh sách rất dài, bạn có thể vượt quá độ dài lệnh tối đa (nó đã xảy ra với tôi) và bạn sẽ không thể grep được. với xargs grep được gọi một lần cho mỗi tệp tìm thấy.
Nathan Fellman

Nhiều phiên bản của Grep, bao gồm Gnu Grep, cung cấp tìm kiếm đệ quy tích hợp ( gnu.org/software/grep/manual/ Kẻ ), vì vậy tìm kiếm của bạn có thể được viết theo grep -i 'string' -R .đó, như @NathanFellman gợi ý, tránh vấn đề về các lệnh quá dài.
Scott Centoni

Câu trả lời:


251

findstr có thể thực hiện tìm kiếm đệ quy (/ S) và hỗ trợ một số biến thể của cú pháp regex (/ R).

C:\>findstr /?
Searches for strings in files.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.

Use spaces to separate multiple search strings unless the argument is prefixed
with /C.  For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

For full information on FINDSTR regular expressions refer to the online Command
Reference.

45
findstr là một sự thay thế tuyệt vời cho grep. Tôi có xu hướng sử dụng findstr / sinp (đệ quy, không phân biệt chữ hoa chữ thường, bỏ qua các tệp nhị phân và hiển thị số dòng)
Steve Rowe

5
Thật không may, findstr có hỗ trợ rất hạn chế cho regex, theo tài liệu và các mẫu tôi đã thử sử dụng.
John Kaster

3
Thở dài, tin tưởng Microsoft để thêm một tiện ích mới (findstr) thay vì sửa một tiện ích hiện có (find). Nếu bạn muốn findstr có thể đếm các dòng, thì hãy sử dụng cái này - findstr [tùy chọn] | find / c / v "" - sử dụng findstr để khớp các dòng và tìm để đếm chúng. Có, tìm xem xét rằng không có dòng nào khớp với một chuỗi trống, vì vậy với / v mỗi dòng sẽ khớp.
yoyo

3
Họ không muốn phá vỡ các đường ống hiện có dựa trên hành vi bị hỏng.
i_am_jorf

133
findstr /spin /c:"string" [files]

Các tham số có ý nghĩa sau đây:

  • s = đệ quy
  • p = bỏ qua các ký tự không in được
  • i = trường hợp không nhạy cảm
  • n = in số dòng

Và chuỗi để tìm kiếm là bit bạn đặt trong dấu ngoặc kép sau /c:


2
Lấy làm tiếc. Bạn có thể thêm một ví dụ? Có gì spin? Đây có phải là dòng văn bản để tìm? Và không / g hoặc / f được sử dụng để chỉ định tệp? Vậy những gì với niềng răng vuông?
Wolfpack'08

5
findstr /?giải thích từng tham số. s = đệ quy, p = bỏ qua các ký tự không in được, i = không phân biệt chữ hoa chữ thường, n = số dòng in. Bạn không nhất thiết cần tất cả những thứ đó, nhưng tôi thích chúng, và spinrất dễ nhớ. Chuỗi để tìm kiếm là bit bạn đặt trong dấu ngoặc kép sau /c:.
i_am_jorf

3
Oh haha. Tôi đã làm một /?, nhưng tôi thực sự không biết rằng các sửa đổi đã được sử dụng như thế nào /spin. Tôi nghĩ rằng họ đã được sử dụng như thế nào /s/p/i/n.
Wolfpack'08

4
Vâng, nói chung. Một số chương trình cmd cho phép bạn giảm /tốc độ. Đây là một. Không phải tất cả trong số họ cho phép bạn làm điều đó. Bạn biết đấy, cmd rất đặc biệt.
i_am_jorf

2
Tuy nhiên, nó được phân phối như một phần của Windows và do đó, đáp ứng các yêu cầu về áp phích ban đầu của một cái gì đó có thể được thực hiện với cmd.exe không yêu cầu bất kỳ phần mềm bổ sung nào được cài đặt.
i_am_jorf

26

Tôi vừa tìm kiếm một văn bản với lệnh sau liệt kê cho tôi tất cả các tên tệp chứa 'văn bản tìm kiếm' được chỉ định của tôi.

C:\Users\ak47\Desktop\trunk>findstr /S /I /M /C:"search text" *.*

13

Tôi đề nghị một công cụ thực sự tuyệt vời:

dụng cụ unix bản địa:

Chỉ cần giải nén chúng và đặt thư mục đó vào biến môi trường PATH và voila của bạn! :)

Hoạt động như một bùa mê, và có nhiều hơn thế nữa chỉ là grep;)


5
@mPrinC Câu hỏi cho biết "Tôi không thể cài đặt Cygwin hoặc bất kỳ công cụ của bên thứ 3 nào như UnxUtils trên máy chủ này".
martin jakubik

7
Nâng cao bởi vì nó vẫn hữu ích cho tôi. Ngoài ra, nó không yêu cầu 'cài đặt', chỉ cần giải nén nó ở đâu đó.
Rosdi Kasim

12

Tìm kiếm đệ quy cho importtừ bên trong srcthư mục:

> findstr /s import .\src\*

9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt

Điều này có vẻ tương tự như câu trả lời này ở đây serverfault.com/a/506615 , nhưng tôi thích thực tế là bạn đặt câu trả lời cho một tệp. Dễ dàng hơn nhiều để tiêu thụ.
jinglểula

Chỉ để tham khảo, với findstr, bạn nhận được tên tệp được tô sáng trên dòng lệnh và bạn không nhận được điều này trong một tệp văn bản (rõ ràng). Vì vậy, không có gì chắc chắn rằng tệp văn bản là định dạng hữu ích hơn.
Martin Greenaway

5

Select-Stringlàm việc tốt nhất cho tôi Tất cả các tùy chọn khác được liệt kê ở đây, chẳng hạn như findstr, không hoạt động với các tệp lớn.

Đây là một ví dụ:

select-string -pattern "<pattern>" -path "<path>"

lưu ý : Điều này đòi hỏi Powershell


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.