Eu precisaria filtrar através de uma lista de arquivos (saída do comando top) para algumas informações:
- Em primeiro lugar, preciso listar arquivos com um find
- Então, eu preciso grep por linhas com um padrão
- Finalmente, preciso pegar uma coluna em que estou interessado.
Parece que não consigo vincular o find com grep e awk:
Minha primeira tentativa:
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)
Segunda tentativa:
find . -name "high-cpu.out" -exec grep "jboss" {} \ | awk '{ print $5 }';
find: missing argument to `-exec'
Qualquer ajuda? Obrigado
Eu recomendo usar o AWK para corresponder ao padrão em vez de
grep
:Isso também permite o uso da
+
variante de-exec
, resultando em menosawk
invocações.Quando você tentou
o shell processou o pipe primeiro, não o
find
. Isso levou àfind
falha com “argumento ausente para '-exec'”:{} \;
não foi incluído nos argumentos passados para ele (eles foram passados paraawk
).Sua segunda tentativa falhou porque
find
não foi possível ver o ponto e vírgula de fechamento, pois não foi separado doawk
argumento. De qualquer forma, o pipe não teria funcionado, poisfind
não delega ao shell.Isso não pode funcionar até que o comando exec seja quebrado/terminado no "|" level para que {} não possa ser interpretado pelo subcomando awk.
então você tem que fazer
ou
mas nunca é uma boa ideia usar muitos comandos sed+awk+grep para o mesmo trabalho; Você tem que escolher um deles e adaptar o padrão regexp para atender às suas necessidades