principio y aplicación de awk
Uno, awk
1. Principio de funcionamiento:
Lea el texto línea por línea, separados por espacio o tabulación de forma predeterminada, guarde los campos separados en variables integradas y ejecute comandos de edición de acuerdo con el modo o condición.
El comando sed se usa a menudo para procesar una línea completa, mientras que awk tiende a dividir una línea en múltiples "campos" y luego procesarla. La lectura de la información de awk también se lee línea por línea, y el resultado de la ejecución se puede imprimir y mostrar con los datos de campo a través de la función de impresión. En el proceso de usar el comando awk, puede usar los operadores lógicos "&&" para significar "y", "||" para significar "o", y "!" Para significar "no"; también puede realizar operaciones matemáticas simples operaciones, como +, -, *, /,%, ^ representan suma, resta, multiplicación, división, resto y potencia, respectivamente.
2. Formato de comando:
awk 选项 '模式或条件 {操作}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
3. Las variables integradas comunes de awk (se pueden usar directamente) son las siguientes:
- FS: Separador de columnas. Especifique el separador de campo para cada línea de texto, el valor predeterminado es un espacio o una tabulación. Igual que "-F"
- NF: el número de campos en la fila procesada actualmente
- NR: el número de fila (número ordinal) de la fila que se está procesando actualmente
- $ 0: el contenido de la línea completa de la línea procesada actualmente
- $ n: el n-ésimo campo de la fila actualmente procesada (la n-ésima columna)
- FILENAME: el nombre del archivo que se está procesando
- RS: Separador de líneas. Cuando awk lee datos del archivo, cortará los datos en muchos registros de acuerdo con la definición de RS, mientras que awk solo lee un registro a la vez para su procesamiento. El valor predeterminado es '\ n'
Dos, varios resultados de salida de awk
1. Salida de texto por línea:
Imprimir todas las líneas
awk '{print}' file1.txt #输出所有内容
awk '{print $0}' file1.txt #输出所有内容
Imprima el contenido de las líneas 1-3
awk 'NR==1,NR==3{print}' file1.txt #输出第1~3行内容
或
awk '(NR>=1)&&(NR<=3){print}' file1.txt
Salida de la primera y tercera líneas
awk 'NR==1||NR==3{print}' file1.txt #输出第1行、第3行内容
awk 'NR==1;NR==3{print $0}' file1.txt
Línea de paridad de salida
awk '(NR%2)==1{print}' testfile2 #输出所有奇数行的内容
awk '(NR%2)==0{print}' testfile2 #输出所有偶数行的内容
Imprime líneas que comienzan y terminan
awk '/^root/{print}' /etc/passwd #输出以 root 开头的行
awk '/nologin$/{print}' /etc/passwd #输出以 nologin 结尾的行
El modo BEGIN significa que antes de procesar el texto especificado, debe realizar la acción especificada en el modo BEGIN; awk procesa el texto especificado y luego ejecuta la acción especificada en el modo END. El bloque de instrucciones END {} a menudo se coloca en Print resultados y otras declaraciones
awk 'BEGIN {FS=":"};{if($3>=200){print}}' /etc/passwd #先处理完BEGIN的内容,awk再打印文本里面的内容
awk 'BEGEIN {X=0};/\/bin\/bash/{x++};END {print x}' /etc/passwd #匹配以/bin/bash结尾的行数等同于 grep -c /etc/passwd
2. Salida de texto por campo
Salida del tercer carácter en cada línea (separados por un espacio o tabulación)
awk -F ":" '{print $3}' /etc/passwd
Salida del primer y tercer campo en cada línea
awk -F ":" '{print $1,$3}' /etc/passwd
awk -F ":" '$3<5(print $1,$3}' /etc/passwd #输出第3字段不小于5的行 并打印该行的第1,第3个字段信息
awk -F ":" '!($3<200){print}' /etc/passwd #输出第3个字段的值不小于200的行
awk 'BEGIN {FS=":"};{if($3>=200){print}}' /etc/passwd #先处理完BEGIN的内容,再打印文本里面的内容
Imprime la línea completa del número de línea
awk -F ":" '{print NR,$0}' /etc/passwd #输出每行内容和行号,每处理完一条记录,NR值加1
($ 3> $ 4)? $ 3: operador ternario de $ 4, si el valor del tercer campo es mayor que el valor del cuarto campo, asigne el valor del primer campo a max e imprima el valor de max, de lo contrario el cuarto Asigne el valor del campo al máximo
awk -F ":" '{max=($3>$4)?$1:$4;{print max}}' /etc/passwd
Imprime el número de línea y el contenido de toda la línea.
awk -F ":" '{print NR,$0}' /etc/passwd #输出每行内容和行号,每处理完一条记录,NR值加1
La línea que contiene / bash en el séptimo campo imprime el primer campo
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd #输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
El primer y segundo campo de una fila con 7 campos que contienen root en el primer campo
awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd #输出第1个字段中包含root且有7个字段的行的第1、2个字段
El séptimo campo no es / bin / bash ni todas las líneas de / sbin / nologin
awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd #输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
3. Invocar comandos de Shell a través de conductos y comillas dobles
echo $PATH | awk 'BEGIN{RS=":"};END{print NR}' #统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
Combine wc para contar el número de filas
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd #调用 wc -l 命令统计使用 bash 的用户个数,等同于 grep -c "bash$" /etc/passwd
Ver el uso de la memoria
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)}' #查看当前内存使用百分比
Ver la tasa de inactividad de la CPU
top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}' #查看当前CPU空闲率,(-b -n 1 表示只需要1次的输出结果)
date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S" #显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}"%"}' #调用w命令,并用来统计在线用户数
awk 'BEGIN {"hostname" | getline ; {print $0}}' #调用 hostname,并输出当前的主机名
Cuando no hay un carácter de redirección "<" o "|" a la izquierda y derecha de getline, getline actúa sobre el archivo actual y lee la primera línea del archivo actual a la variable var o $ 0 seguida de ella; debería ser señaló que debido a que awk ya ha procesado getline antes de que se lea A line, el resultado de retorno de getline está entrelazado. Cuando hay caracteres de redirección "<" o "|" a la izquierda y derecha de getline, getline actúa sobre el archivo de entrada direccional. Dado que el archivo se acaba de abrir y awk no lo ha leído en una línea, solo lo lee getline, luego getline devuelve esto La primera línea del archivo, no cada dos líneas.
seq 10 | awk '{print $0; getline}' 获取奇数行
seq 10 | awk '{getline; print $0}' 获取偶数行
Obtenga la dirección IP local