찾기 명령을 통해 awk에 유닉스의 머리를 적용합니다
문제
이 스 니펫을 사용하여 찾은 파일 목록에서 상위 10 줄의 AWK 명령을 출력하고 싶습니다.
$ find . -name "*.txt" -print -exec awk '$9 != ""' \| head -n10 {} \;
또한 처리중인 파일 이름을 인쇄하고 싶습니다.
그러나 왜 그런 오류가 발생했는지 :
awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt
올바른 방법은 무엇입니까?
나는 파이프 전에 백 슬래시없이 시도했다. 여전히 오류가 발생했습니다.
find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory
해결책
Find의 모든 파일에서 AWK 프로그램을 실행하려면 처음 10 줄만 인쇄합니다. 매번.
$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
다른 팁
Find 's -exec으로 명령을 실행할 때 파이프 연산자 (|)와 같은 멋진 쉘을 모두 얻을 수는 없습니다. 그래도 원하는 경우 서브 쉘을 명시 적으로 실행하여 회복 할 수 있습니다.
찾기 . -name '*.txt'-exec /bin /sh -c "echo {} | head -n 15"라는 텍스트 파일;
Ashawley의 답변을 바탕으로 :
find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;
10 번째 레코드 후에 Awk를 종료 할 때 더 잘 수행해야합니다.
사용 awk
만 작동해야합니다.
find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
당신도 이런 식으로 할 수 있습니다 :
find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {} \;
없이 head
.
제휴하지 않습니다 StackOverflow