find + grep + awk 조합을 사용하세요.

find + grep + awk 조합을 사용하세요.

일부 정보를 얻으려면 목록 파일(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 명령을 많이 사용하는 것은 결코 좋은 생각이 아닙니다. 그 중 하나를 선택하고 필요에 맞게 패턴의 정규식을 조정해야 합니다.

관련 정보