awk
두 개의 서로 다른 열의 값을 얻은 적이 있다고 가정해 보겠습니다 .
출력은 다음과 같다고 가정합니다.
알파벳
정의
이제 이전 명령과 함께 파이프를 사용하기 위한 패턴으로 abc
및를 사용 하고 싶습니다 . 이를 수행할 수 있는 방법이 있습니까?def
grep
자세한 지침은 다음을 참조하세요.
PDF 파일이 있고 다음을 사용하여 파일에서 키워드를 검색하고 있습니다.
pdftotext 'filename.pdf' - | grep 'pattern'
이제 일치하는 항목이 발견되면 결과의 첫 번째 열과 두 번째 열을 이전 명령이 포함된 파이프라인에서 grep에 대한 인수로 사용하려고 합니다. 처음 두 열을 사용할 수 있습니다
pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }'
이제 파이프라인에서 grep 명령 이후에 이 두 값을 위 값에 다시(두 번째) 패턴으로 전달하려면 어떻게 해야 할까요?
답변1
다음과 같이 프로세스 대체를 통해 이를 수행할 수 있습니다.
grep -f <(awk '{print $1 "\n" $3}' filename) otherfile
이는 grep
파일(플래그)에서 패턴을 읽습니다. 이 경우 실제로는 -f
한 줄에 하나의 패턴을 인쇄하는 프로세스의 출력입니다. awk...filename
그런 다음 이러한 패턴을 찾아보세요.otherfile
grep
비록 덜 효율적일 수 있지만 실제로 파이프에서 이 작업을 수행하려면 표준 입력에서 해당 패턴을 읽어서 수행할 수 있습니다.
awk '{print $1 "\n" $3}' filename | grep -f - otherfile
편집: grep과 awk 사용에 대한 질문 편집 내용을 보면 다음을 수행하여 awk가 패턴 일치를 수행하도록 할 수 있습니다.
grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile
또는 파이프로:
pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile
답변2
많은 쉘 지원명령 대체예를 들어
p=$(awk '{ print $1,$3 }' filename)
명령의 출력을 awk '{ print $1,$3 }' filename
변수로 캡처합니다 p
. 여기서는 cat
중복되므로 awk
에서 직접 수행할 수 있습니다 filename
.
하지만 당신이 정말로 하고 싶은 일은 처리하는 일인 것 같아요.마디 없는출력 라인을 awk
분석하고분리변하기 쉬운. 이 경우 다음을 수행할 수 있습니다.
awk '{print $1,$3}' filename | while read -r p1 p2; do grep -F "$p1" otherfile | grep -F "$p2"; done
otherfile
필드 $1
및 from 과 모두 $3
일치하는 행을 찾습니다 filename
.
답변3
이는 명령 대체를 사용하여 수행할 수 있습니다.
에서 인용여기:
명령 대체를 사용하면 명령 이름 자체를 명령의 출력으로 바꿀 수 있습니다. 명령 대체는 명령에 다음이 포함된 경우 발생합니다.
$(command)
또는 (백틱 버전):
`command`
답변4
xargs
매개변수 전달 및 정의를 사용하는 방법을 배울 수 있습니다 .
cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile
xargs -I {}
grep이 사용할 수 있도록 매개변수를 "{}"로 바꾸세요.