일부 정보를 얻으려면 목록 파일(top 명령의 출력)을 필터링해야 합니다.
- 먼저 find를 사용하여 파일을 나열해야 합니다.
- 그런 다음 패턴이 있는 줄을 찾기 위해 grep해야 합니다.
- 마지막으로 내가 관심 있는 칼럼을 골라야 한다.
찾기를 바인딩하기 위해 grep 및 awk를 사용할 수 없는 것 같습니다.
내 첫 번째 시도:
find . -name "high-cpu.out" -exec grep "jboss" | awk '{ print $5 }' {} \;
find: missing argument to `-exec'
awk: fatal: cannot open file `{}' for reading (No such file or directory)
두 번째 시도:
find . -name "high-cpu.out" -exec grep "jboss" {} \ | awk '{ print $5 }';
find: missing argument to `-exec'
도움이 필요하세요? 감사해요
답변1
대신 AWK를 사용하여 패턴을 일치시키는 것이 좋습니다 grep
.
find . -name "high-cpu.out" -exec awk '/jboss/ { print $5 }' {} +
또한 이를 통해 사용량을 +
다양 화할 수 있으므로 호출 횟수가 -exec
줄어듭니다 .awk
당신이 시도할 때
find . -name "high-cpu.out" -exec grep "jboss" | awk '{ print $5 }' {} \;
대신 쉘이 먼저 파이프를 처리합니다 find
. 이로 인해 find
"'-exec'에 대한 인수 누락" 오류가 발생했습니다 . {} \;
전달된 인수에 포함되지 않았습니다(그들은 awk
).
두 번째 시도는 실패합니다. 닫는 세미콜론이 매개 변수와 분리 find
되지 않았기 때문에 볼 수 없기 때문입니다. awk
어떤 경우에도 파이프는 find
셸에 위임되지 않으므로 작동하지 않습니다.
답변2
찾다. -name "high-cpu.out" -exec grep "jboss" | -name "high-cpu.out" -exec grep "jboss" awk '{ print $5 }' {} ;
찾기: 읽기를 위한 {}' 인수 누락
-exec' awk: fatal: cannot open file
(해당 파일이나 디렉터리 없음)
exec 명령이 "|"에서 중단/완료될 때까지 작동하지 않습니다. 따라서 {}는 awk 하위 명령으로 해석될 수 없습니다.
그래서 당신은해야합니다
....... -exec awk '/pattern/ {operation}' {} +
또는
find . -name "high-cpu.out" -exec grep pattern {} \; | awk '{operation}'
그러나 동일한 작업을 수행하기 위해 sed+awk+grep 명령을 많이 사용하는 것은 결코 좋은 생각이 아닙니다. 그 중 하나를 선택하고 필요에 맞게 패턴의 정규식을 조정해야 합니다.