Windows 재귀 grep 명령 줄


204

Windows에서 재귀 grep을 수행해야합니다. Unix / Linux에서는 다음과 같습니다.

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

또는 더 선호되는 방법 :

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

cmd.exe 만 붙어 있으므로 Windows 기본 제공 명령 만 있습니다. 불행히도이 서버에 Cygwin 또는 UnxUtils 와 같은 타사 도구를 설치할 수 없습니다 . PowerShell을 설치할 수 있는지 확실하지 않습니다. cmd.exe 내장 (Windows 2003 Server) 만 사용하는 제안이 있습니까?


Powershell이 ​​없으면 어렵습니다. 왜 설치할 수 없습니까?
Chris Ballance

시스템 관리자가 서버에 대한 권한을 잠그고 있습니다. 누군가 Powershell 제안이 있으면이를 폐기하고 PowerShell을 설치할 수 있는지 살펴 보겠습니다.
Andy White

3
btw, 나는 리눅스에서 "find. | xargs grep -i string"을 쓰는 것이 더 낫다는 것을 알았다. 차이점은 find가 매우 긴 목록을 반환하면 최대 명령 길이를 초과 할 수 있으며 (나에게 일어난 일), grep을 전혀 할 수 없다는 것입니다. xargs로 grep은 찾은 파일 당 한 번 호출됩니다.
Nathan Fellman

Gnu Grep을 포함한 많은 Grep 버전은 내장 재귀 검색 ( gnu.org/software/grep/manual/… )을 제공하므로 grep -i 'string' -R .@NathanFellman과 같이 긴 명령의 문제를 피할 수 있도록 검색을 작성할 수 있습니다 .
Scott Centoni 2016 년

답변:


251

findstr 재귀 검색 (/ S)을 수행 할 수 있으며 일부 정규 표현식 구문 (/ 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은 grep을 대체합니다. findstr / sinp (재귀 적, 대소 문자 구분, 이진 파일 건너 뛰기 및 줄 번호 표시)를 사용하는 경향이 있습니다.
Steve Rowe

5
불행히도 findstr은 문서와 내가 사용하려고 시도한 패턴에 따라 정규 표현식을 매우 제한적으로 지원합니다.
John Kaster

3
한숨, Microsoft는 기존 유틸리티 (find)를 수정하는 대신 새 유틸리티 (findstr)를 추가 할 것을 믿습니다. findstr이 행을 계산할 수있게하려면 다음을 사용하십시오. findstr [options] | find / c / v ""-findstr을 사용하여 줄을 찾아서 계산합니다. 예, 찾기는 빈 문자열과 일치하는 행이 없으므로 / v를 사용하면 모든 행이 일치한다고 간주합니다.
yoyo

3
그들은 찾기의 끊어진 행동에 의존하는 기존 파이프 라인을 파괴하고 싶지 않았습니다.
i_am_jorf

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

매개 변수는 다음과 같은 의미를 갖습니다.

  • s = 재귀
  • p = 인쇄 할 수없는 문자 건너 뛰기
  • i = 대소 문자 구분
  • n = 인쇄 라인 번호

그리고 검색 할 문자열은 따옴표로 묶은 비트입니다. /c:


2
죄송합니다. 예를 추가 할 수 있습니까? 무엇입니까 spin? 찾을 텍스트 줄입니까? / g 또는 / f는 파일을 지정하는 데 사용되지 않습니까? 그러면 대괄호는 무엇입니까?
Wolfpack'08

5
findstr /?각 매개 변수를 설명합니다. s = 재귀, p = 인쇄 불가능 문자 건너 뛰기, i = 대소 문자 구분, n = 인쇄 줄 번호. 당신은 반드시 그들 모두를 필요로하지는 않지만, 나는 그들을 좋아하고 spin기억하기 쉽습니다. 검색 할 문자열은 뒤에 인용 부호를 넣은 비트 /c:입니다.
i_am_jorf

3
오 하하 나는 /?했지만 실제로 수정자가처럼 사용되었다는 것을 알지 못했습니다 /spin. 나는 그들이 같은 것으로 생각했다 /s/p/i/n.
Wolfpack'08 08

4
예, 일반적으로 일부 cmd 프로그램을 사용하면 srt를 느슨하게 할 수 있습니다 /. 이것은 하나입니다. 그들 모두가 그렇게 할 수있는 것은 아닙니다. cmd는 매우 특별합니다.
i_am_jorf

2
그러나 Windows의 일부로 배포되므로 추가 소프트웨어를 설치하지 않아도 cmd.exe로 수행 할 수있는 원본 포스터 요구 사항을 충족합니다.
i_am_jorf

26

방금 지정된 '검색 텍스트'를 포함하는 모든 파일 이름을 나열한 다음 명령으로 텍스트를 검색했습니다.

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

13

정말 훌륭한 도구를 추천합니다 :

네이티브 유닉스 유틸리티 :

그것들을 풀고 그 폴더를 PATH 환경 변수와 짜잔에 넣으십시오! :)

매력처럼 작동하며 grep보다 훨씬 많은 것이 있습니다.)


5
@mPrinC 질문에 "안타깝게도이 서버에 Cygwin 또는 UnxUtils와 같은 타사 도구를 설치할 수 없습니다"라는 메시지가 표시됩니다.
martin jakubik

7
그것은 여전히 ​​나에게 유용하기 때문에 공감. 또한 '설치'가 필요하지 않으며 어딘가에 추출하십시오.
Rosdi Kasim

12

폴더 import내 단어를 재귀 적으로 검색 src:

> findstr /s import .\src\*

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

이것은 this answer here serverfault.com/a/506615 와 유사 하지만 응답을 파일로 파이프한다는 사실이 마음에 듭니다. 소비하기가 훨씬 쉽습니다.
jinglesthula

findstr을 사용하면 명령 줄에 강조 표시된 파일 이름이 표시되고 텍스트 파일에 파일 이름이 표시되지 않습니다 (분명히). 따라서 텍스트 파일이 더 유용한 형식이라는 것은 아닙니다.
Martin Greenaway

5

Select-String나를 위해 가장 잘 작동했습니다. 와 같이 여기에 나열된 다른 모든 옵션 findstr은 큰 파일에서 작동하지 않았습니다.

예를 들면 다음과 같습니다.

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

참고 : 여기에는 Powershell이 ​​필요합니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.