grep의 출력 컨텍스트(-C)는 많은 수의 파일을 생성합니다.

grep의 출력 컨텍스트(-C)는 많은 수의 파일을 생성합니다.

일:

grep일부 텍스트 파일을 검색하고 결과를 한 줄(특정 줄 제외)에서 다른 줄(특정 줄과 일치)로 전송하고 다음 과 같은 grep매개 변수를 사용하여 일부 컨텍스트를 표시하는 데 사용하고 있습니다 .-C

grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " 

질문:

이는 결과를 인쇄할 때 훌륭하게 작동하지만 다음과 같이 매우 큰 파일(~수 GB)을 생성하고 파일에 쓸 때 시간이 오래 걸립니다.

grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " > out.txt

문제 해결:

  1. grep에 따르면 1345 개의 행만 반환되며 wc출력을 인쇄하는 데 몇 초가 걸립니다.

  2. 큰 출력 파일의 출력은 입력 파일의 실제 결과라고도 하는 합법적인 것처럼 보입니다.

  3. 연산자를 or -C로 바꾸면 KB 크기의 멋진 출력 파일이 생성됩니다.-A-B

질문:

  • 왜 이런 일이 발생합니까?
  • -C이런 일을 망칠 수있는 것이 있습니까 ?
  • 아니면 다른 문제를 간과하고 있습니까?

어떤 조언이라도 감사하겠습니다! MacOS 터미널에서 실행하세요. 나는 팔로우하고 있다이것남성.

답변1

쓰고 있는 디렉토리를 변경해 보십시오 out.txt. 예를 들어 이 명령을 다음과 같이 변경합니다.

$ grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " > /tmp/out.txt

여기에서 Bash 셸에서 상세 출력이 활성화되면 어떤 일이 발생하는지 확인할 수 있습니다.

$ set -x
$ grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " > out.txt
+ grep --color=auto -nE -C1 ' leaves? '
+ grep --color=auto -v Chapter file01.txt file02.txt file03.txt file04.txt file05.txt file06.txt file07.txt file08.txt file09.txt file10.txt out.txt

인수를 받아들이고 *.txt확장하며 file 을 포함합니다 out.txt. 따라서 작성하는 동안 실제로 파일을 구문 분석하고 있습니다.

왜?

첫 번째 명령의 출력이 다음 명령으로 파이프될 때 쉘이 수행하는 작업을 생각해 보면 이는 의미가 있습니다. 쉘은 방금 내린 명령을 구문 분석하여 파이프( |)를 찾습니다. 이를 발견하면 오른쪽에 있는 명령을 실행하여 파이프 내에서 발생하는 명령 사이의 STDIN/STDOUT에 대한 리디렉션을 설정해야 합니다.

sleep명령을 사용하면 더 많은 파이프를 추가할 때 쉘이 항목을 구문 분석하는 방법을 확인할 수 있습니다.

$ sleep 0.1 | sleep 0.2 | sleep 0.3 | sleep 0.4
+ sleep 0.2
+ sleep 0.3
+ sleep 0.4
+ sleep 0.1

$ sleep 0.1 | sleep 0.2 | sleep 0.3 | sleep 0.4 | sleep 0.5
+ sleep 0.2
+ sleep 0.3
+ sleep 0.4
+ sleep 0.5
+ sleep 0.1

echostat+write to file을 사용하여 이 작업을 수행하면 파일 액세스 및 명령 표시 순서 에도 적용됩니다 .

$ echo "1" > file1 | echo "2" > file2 | echo "3" > file3 | echo "4" > file4
+ echo 2
+ echo 3
+ echo 4
+ echo 1

$ stat file* | grep -E "File|Access: [[:digit:]]+"
+ grep --color=auto -E 'File|Access: [[:digit:]]+'
+ stat file1 file2 file3 file4
  File: ‘file1’
Access: 2018-08-11 23:55:20.868220474 -0400
  File: ‘file2’
Access: 2018-08-11 23:55:20.865220576 -0400
  File: ‘file3’
Access: 2018-08-11 23:55:20.866220542 -0400
  File: ‘file4’
Access: 2018-08-11 23:55:20.867220508 -0400

관련 정보