일:
grep
일부 텍스트 파일을 검색하고 결과를 한 줄(특정 줄 제외)에서 다른 줄(특정 줄과 일치)로 전송하고 다음 과 같은 grep
매개 변수를 사용하여 일부 컨텍스트를 표시하는 데 사용하고 있습니다 .-C
grep -v "Chapter" *.txt | grep -nE -C1 " leaves? "
질문:
이는 결과를 인쇄할 때 훌륭하게 작동하지만 다음과 같이 매우 큰 파일(~수 GB)을 생성하고 파일에 쓸 때 시간이 오래 걸립니다.
grep -v "Chapter" *.txt | grep -nE -C1 " leaves? " > out.txt
문제 해결:
grep
에 따르면 1345 개의 행만 반환되며wc
출력을 인쇄하는 데 몇 초가 걸립니다.큰 출력 파일의 출력은 입력 파일의 실제 결과라고도 하는 합법적인 것처럼 보입니다.
연산자를 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
echo
stat
+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