Qual é a diferença entre impressão e cabeça?

1

Eu sei que head fornece a seção inicial de um arquivo. Mas neste caso, estou tentando passar pelo meu controle de origem e encontrar todos os arquivos que possuem uma linha shebang. E não estou obtendo resultados quando uso head . O que estou fazendo errado?

Quando digo que não funciona, quero dizer que não retorna nada. Mas eu sei que deveria ter retornado algo.

Funciona, mas devagar!

find . | awk '!/((\.jpeg)|(\.jpg)|(\.html)|(\.png))$/ {print $0; }' | xargs grep "#!"

não funciona

find . | awk '!/((\.jpeg)|(\.jpg)|(\.html)|(\.png))$/ {head $0; }' | xargs grep "#!"

Atualizar Como @devnull apontou, e facilmente verificado por googling. Vou listar aqui para referência: Comandos do Awk

if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
for ( variable in array ) statement
break
continue
{ [ statement ] ...}
variable=expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
next
exit
    
por user1766760 07.03.2014 / 20:25

2 respostas

3

O awk é um comando que é um interpretador de uma linguagem de programação destinada ao processamento de texto simples. Embora possa, na verdade não é para ser usado para chamar outros comandos como o comando head .

Aqui, você pode fazer um shell fazer o trabalho:

find . -type f \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' \
                  -o -name '*.html' \) -exec sh -c '
  for file do
    IFS= read -r line < "$file" &&
       case $line in
         ("#!"*) printf "%s\n" "$file: $line"
       esac
  done' sh {} +

Se você quisesse fazer isso com awk , com GNU awk :

find . -type f \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' \
                  -o -name '*.html' \) -exec awk '
    /^#!/ {print FILENAME ": " $0}; {nextfile}' {} +

Com outros awk s:

find . -type f \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' \
                  -o -name '*.html' \) -exec awk '
   BEGIN {
     for (i = 1; i < ARGC; i++)
       if ((getline < ARGV[i]) > 0 && /^#!/)
         print ARGV[i] ": " $0
     exit
   }' {} +
    
por 07.03.2014 / 22:04
1

Algo como grep -R '^#!' . deve fornecer rapidamente uma lista de candidatos para uma análise mais detalhada.

    
por 08.03.2014 / 00:46