Vou me juntar ao outro conselho de que você não deve analisar a saída de ls
, então esse é um mau exemplo. Mas como uma questão mais geral, eu incluiria o script awk diretamente no shell script passando-o como um argumento para awk
.
#!/bin/bash
ls -lhF "$@" | awk '
( NF >= 9 ) {
print "|-- [" $5 "] " $9
}'
Observe que, se o script awk precisar incluir o caractere '
(aspas simples), será necessário citá-lo: use '\''
(feche aspas simples, aspas simples literais, aspas simples abertas).
Para evitar a cotação, você pode usar um documento aqui . Mas é estranho porque você não pode usar a entrada padrão para alimentar a entrada para o awk e para alimentar o script. Você precisa usar um descritor de arquivo adicional (consulte Quando você usaria um descritor de arquivo adicional? Descritores de arquivo e script de shell ).
#!/bin/bash
ls -lhF "$@" | awk -f /dev/fd/3 3<<'EOF'
( NF >= 9 ) {
print "|-- [" $5 "] " $9
}
EOF
Dentro do awk, você pode ler a entrada de outro comando usando a função getline
e a construção do pipe. Não é como o awk é projetado principalmente para ser usado, mas pode ser feito para funcionar. Você precisa citar os argumentos do nome do arquivo para o shell subjacente, que é altamente propenso a erros. E como o texto a ser processado não vem das fontes esperadas (entrada padrão ou arquivos nomeados na linha de comando), você acaba com todo o código no bloco BEGIN
.
#!/usr/bin/awk -f
BEGIN {
command = "ls -lhF"
for (i = 1; i <= ARGC; i++) {
arg = ARGV[i];
gsub("'", "'\''", arg);
command = command " '" arg "'";
}
ARGC = 0; for (i in ARGV) delete ARGV[i];
while ((command | getline) > 0) {
if (NF >= 9) { print "|-- [" $5 "] " $9 }
}
}
Em suma, use um shell para o que é bom (como comandos de piping juntos) e awk para o que é bom (como processamento de texto).