Introducción
Awk es una poderosa herramienta de procesamiento de texto desarrollada por el proyecto GNU. Se utiliza principalmente para leer la entrada (generalmente un archivo de texto), hacer coincidir cada línea de acuerdo con ciertas condiciones y luego realizar operaciones específicas en las líneas coincidentes.
Uso básico
awk
El uso básico es el siguiente:
# 格式
$ awk 动作 文件名
# 示例
$ awk '{print $0}' demo.txt
En el ejemplo anterior, demo.txt
es awk
el archivo de texto que se va a procesar. Hay una llave dentro de la comilla simple anterior, que contiene la acción de procesamiento para cada línea print $0
. Entre ellos, print
se encuentra el comando de impresión, $0
que representa la línea actual, por lo que el resultado de la ejecución del comando anterior es imprimir cada línea tal como está.
A continuación, primero utilizamos la entrada estándar (stdin) para demostrar el ejemplo anterior.
$ echo 'this is a test' | awk '{print $0}'
this is a test
En el código anterior, print $0
se reimprime la entrada estándar this is a test
.
awk
Cada línea se dividirá en varios campos según espacios y tabulaciones, donde , , representa $1
el primer campo, el segundo campo, el tercer campo, etc.$2
$3
$ echo 'this is a test' | awk '{print $3}'
a
En el código anterior, $3
representa this is a test
el tercer campo a
.
A continuación, a modo de ejemplo, guardamos /etc/passwd
el archivo 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
El delimitador de campo de este archivo es dos puntos ( :
), por lo que debe utilizar -F
el parámetro para especificar el delimitador como dos puntos. Luego, se puede extraer su primer campo.
$ awk -F ':' '{ print $1 }' demo.txt
root
daemon
bin
sys
sync
variable
Además de $ +
los números que representan un campo, awk
también se proporcionan otras variables.
La variable NF
indica cuántos campos hay en la fila actual, por lo $NF
que representa el último campo.
$ echo 'this is a test' | awk '{print $NF}'
test
$(NF-1)
Representa el penúltimo campo.
$ awk -F ':' '{print $1, $(NF-1)}' demo.txt
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
En el código anterior, print
la coma en el comando significa que al generar, se utiliza un espacio para separar las dos partes.
La variable NR
indica qué fila se está procesando actualmente.
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
En el código anterior, print
en el comando, si los caracteres se muestran como están, deben colocarse entre comillas dobles.
awk
Las otras variables integradas son las siguientes.
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。