Você quer
awk '...' xyz*
Se, por alguma razão muito estranha, você quiser fazer isso inteiramente dentro do awk:
awk 'FILENAME ~ /^xyz/ { .... }' *
Eu tenho 3 arquivos em um diretório: xyz1.txt
, xyz2.txt
, rst_xyz.txt
e quero trabalhar com APENAS os dois primeiros (aqueles que começam com xyz). O comando ls | awk '/xyz/{print $1}'
retornará todos os três. Quais alterações eu posso fazer no comando para especificar SOMENTE os arquivos xyz *? Eu tentei ls | awk '/^xyz/{print $1}'
pensando que isso iria garantir que o arquivo fosse iniciado com xyz, mas isso não exclui rst_xyz.txt
.
Você quer
awk '...' xyz*
Se, por alguma razão muito estranha, você quiser fazer isso inteiramente dentro do awk:
awk 'FILENAME ~ /^xyz/ { .... }' *
não há necessidade de awk. basta usar o nome do arquivo glob:
ls xyz*
O mais provável é que você queira enviar os nomes dos arquivos para trabalhar neles? assim, talvez?
ls xyz* | some other commands
Nesse caso, é melhor usar um loop for.
for filename in xyz*
do
some other commands "$filename"
done
observe que na primeira variante os nomes dos arquivos virão como um fluxo para stdin de some other commands
enquanto no loop for os nomes dos arquivos virão um por um como um argumento de linha de comando para some other command
.
ls | awk '/^xyz/'
Sua solução original estava faltando apenas o ^
no regep, que ancora a correspondência ao início da linha. Você não precisa de um bloco print
porque a ação padrão ao encontrar uma correspondência é imprimir a linha. Se você quer ser explícito, pode escrever:
ls | awk '/^xyz/ {print $0}'
Você deve usar $0
em vez de $1
, caso o nome do arquivo contenha espaços (embora, se o nome do arquivo contiver nova linha, isso ainda o tratará como vários nomes).
Tags command-line bash awk linux