Introdução
Awk é uma poderosa ferramenta de processamento de texto desenvolvida pelo projeto GNU. É usado principalmente para ler a entrada (geralmente um arquivo de texto), combinar cada linha de acordo com certas condições e, em seguida, executar operações especificadas nas linhas correspondentes.
Uso básico
awk
O uso básico é o seguinte:
# 格式
$ awk 动作 文件名
# 示例
$ awk '{print $0}' demo.txt
No exemplo acima, demo.txt
é awk
o arquivo de texto a ser processado. Há uma chave dentro da aspa simples anterior, que contém a ação de processamento para cada linha print $0
. Entre eles print
está o comando print, $0
que representa a linha atual, portanto o resultado da execução do comando acima é imprimir cada linha como está.
A seguir, primeiro usamos a entrada padrão (stdin) para demonstrar o exemplo acima.
$ echo 'this is a test' | awk '{print $0}'
this is a test
No código acima, print $0
a entrada padrão é this is a test
reimpressa.
awk
Cada linha será dividida em vários campos baseados em espaços e tabulações, utilizando $1
, $2
, $3
para representar o primeiro campo, o segundo campo, o terceiro campo e assim por diante.
$ echo 'this is a test' | awk '{print $3}'
a
No código acima, $3
representa this is a test
o terceiro campo a
.
Abaixo, a título de exemplo, salvamos /etc/passwd
o arquivo como demo.txt
.
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
O delimitador de campo deste arquivo é dois pontos ( :
), então você precisa usar -F
o parâmetro para especificar o delimitador como dois pontos. Então, seu primeiro campo pode ser extraído.
$ awk -F ':' '{ print $1 }' demo.txt
root
daemon
bin
sys
sync
variável
Além dos $ +
números que representam um campo, awk
também são fornecidas diversas outras variáveis.
A variável NF
indica quantos campos existem na linha atual, portanto $NF
representa o último campo.
$ echo 'this is a test' | awk '{print $NF}'
test
$(NF-1)
Representa o penúltimo campo.
$ awk -F ':' '{print $1, $(NF-1)}' demo.txt
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
No código acima, print
a vírgula no comando significa que na saída, um espaço é usado para separar as duas partes.
A variável NR
indica qual linha está sendo processada no momento.
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
No código acima, print
no comando, se os caracteres forem exibidos como estão, eles deverão ser colocados entre aspas duplas.
awk
As outras variáveis integradas são as seguintes.
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。