분류 기타

Linux grep 명령을 사용하는 방법

컨텐츠 정보

  • 조회 103 (작성일 )

본문

1974년 Ken Thompson이 개발한 고전적인 Unix 명령 중 하나는 grep(전역 정규식 인쇄) 명령입니다. 

컴퓨팅에서 매우 보편적이어서 동사("파일을 통해 grepping")로 자주 사용되며 청중이 얼마나 괴짜인지에 따라 실제 시나리오에도 잘 맞습니다. (예를 들어, "해당 정보를 기억하려면 메모리 뱅크를 grep해야 합니다.") 간단히 말해서 grep은 파일에서 특정 패턴의 문자를 검색하는 방법입니다. 

모든 워드 프로세서나 텍스트 편집기에서 사용할 수 있는 최신 찾기 기능처럼 들리면 이미 grep이 컴퓨팅 산업에 미치는 영향을 경험한 것입니다.


현대 기술로 대체된 기이한 오래된 명령이 아니라 grep의 진정한 힘은 두 가지 측면에 있습니다.


  • Grep은 터미널에서 작동하고 데이터 스트림에서 작동하므로 복잡한 프로세스에 통합할 수 있습니다. 텍스트 파일에서 단어를 찾을 수 있을 뿐만 아니라; 단어를 추출하여 다른 명령으로 보내는 등의 작업을 수행할 수 있습니다.
  • Grep은 정규식을 사용하여 유연한 검색 기능을 제공합니다.


grep 명령을 배우는 것은 약간의 연습이 필요하지만 쉽습니다. 이 기사에서는 내가 가장 유용하다고 생각하는 몇 가지 기능을 소개합니다.


grep 설치 


Linux를 사용하는 경우 이미 grep이 설치되어 있습니다.


macOS에는 BSD 버전의 grep이 있습니다. 이것은 GNU 버전과 약간 다르므로 이 기사를 정확히 따르려면 Homebrew 또는 MacPorts와 같은 프로젝트에서 GNU grep을 설치하십시오.


Basic grep 


기본 grep 구문은 항상 동일합니다. grep 명령에 패턴과 검색할 파일을 제공합니다. 그 대가로 각 행을 일치하는 항목과 함께 터미널에 인쇄합니다.


grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>. 


기본적으로 grep 명령은 대소문자를 구분하므로 "gnu"는 "GNU" 또는 "Gnu"와 다릅니다. --ignore-case 옵션을 사용하여 대소문자를 무시하도록 할 수 있습니다.


grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>. 


--invert-match 옵션을 사용하여 grep 명령이 일치하지 않는 모든 행을 반환하도록 할 수도 있습니다.


grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 329 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read 


Pipes 


파일에서 텍스트를 찾을 수 있으면 유용하지만 POSIX의 진정한 장점은 "파이프"를 통해 명령을 함께 연결할 수 있다는 것입니다. grep을 가장 잘 사용하는 것은 cut, tr 또는 curl과 같은 다른 도구와 결합할 때입니다.


예를 들어 다운로드하려는 일부 기술 문서가 나열된 파일이 있다고 가정해 보겠습니다. 파일을 열고 각 링크를 수동으로 클릭한 다음 Firefox 옵션을 클릭하여 각 파일을 하드 드라이브에 저장할 수 있지만 시간이 많이 걸리고 클릭해야 합니다. 대신 --only-matching 옵션을 사용하여 일치하는 문자열만 인쇄하여 파일의 링크를 grep할 수 있습니다.


grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf 


출력은 각각 한 줄에 있는 URL 목록입니다. 이것은 Bash가 데이터를 처리하는 방식에 자연스럽게 부합하므로 URL을 터미널에 인쇄하는 대신 curl로 파이프할 수 있습니다.


grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name 


이렇게 하면 각 파일이 다운로드되어 원격 파일 이름에 따라 내 하드 드라이브에 저장됩니다.


이 예에서 내 검색 패턴은 비밀스러워 보일 수 있습니다. 많은 텍스트를 광범위하게 검색할 때 특히 유용한 일종의 "와일드카드" 언어인 정규식을 사용하기 때문입니다.


Regular expression 


정규 표현식(줄여서 "regex")이 쉽다는 환상을 가진 사람은 아무도 없습니다. 

그러나 나는 종종 그것이 마땅한 것보다 더 나쁜 평판을 가지고 있다는 것을 알게 되었습니다. 분명히, 읽을 수 없고 너무 넓어서 저절로 접힐 때까지 정규식을 너무 영리하게 사용할 가능성이 있지만 정규식을 과도하게 사용할 필요는 없습니다. 

다음은 내가 사용하는 정규식에 대한 간략한 소개입니다.


먼저 example.txt라는 파일을 만들고 다음 텍스트를 입력합니다.


Albania
Algeria
Canada
0
1
3
11 


정규식의 가장 기본적인 요소는 .입니다. 캐릭터. 단일 문자를 나타냅니다.


grep Can.da example.txt
Canada 


패턴 Can.da는 성공적으로 캐나다를 반환했습니다. 왜냐하면 . 문자는 하나의 문자를 나타냅니다.


NS . 와일드카드는 다음 표기법을 사용하여 둘 이상의 문자를 나타내도록 수정할 수 있습니다.


  • ? 이전 항목과 0번 또는 1번 일치
  • * 앞의 항목과 0번 이상 일치
  • + 이전 항목과 한 번 이상 일치
  • {4}는 앞의 항목 4번(또는 중괄호에 입력한 숫자)과 일치합니다.

이 지식으로 무장하면 오후 내내 example.txt에서 정규식을 연습하여 흥미로운 조합이 무엇인지 확인할 수 있습니다. 일부는 작동하지 않습니다. 다른 사람들은 그럴 것이다. 중요한 것은 결과를 분석하여 그 이유를 이해하는 것입니다.


고급 정규식에는 --extended-regexp 또는 -E 옵션이 필요합니다.


예를 들어 다음은 국가를 반환하는 데 실패합니다.


grep -E A.a example.txt 


. 때문에 실패합니다. 캐릭터는 레벨을 올리지 않는 한 단일 캐릭터와만 일치할 수 있습니다. * 문자를 사용하여 grep에 단일 문자 0 또는 단어 끝에 도달할 때까지 필요한 만큼 일치하도록 지시할 수 있습니다. 다루고 있는 목록을 알고 있기 때문에 이 경우에는 0번이 쓸모가 없다는 것을 알고 있습니다. 

이 목록에는 세 글자로 된 국가 이름이 없습니다. 따라서 대신 +를 사용하여 단일 문자를 적어도 한 번은 일치시킨 다음 단어가 끝날 때까지 필요한 만큼 다시 일치시킬 수 있습니다.


grep -E A.+a example.txt
Albania
Algeria 


대괄호를 사용하여 문자 목록을 제공할 수 있습니다.


grep -E [AC].+a example.txt
Albania
Algeria
Canada 


이것은 숫자에도 적용됩니다. 결과는 다음과 같이 놀랄 수 있습니다.


grep [1-9] example.txt
1
3
11 


1에서 9까지의 숫자를 검색할 때 11이 표시되는 것이 놀랍습니까?


목록에 13을 추가하면 어떻게 됩니까?


이 숫자는 일치시킬 숫자 목록 중 1을 포함하기 때문에 반환됩니다.


보시다시피 정규식은 일종의 퍼즐이지만 실험과 연습을 통해 익숙해지고 데이터를 통해 grep하는 방식을 개선하는 데 사용할 수 있습니다.


출처 : https://opensource.com/article/21/3/grep-cheat-sheet