Principio y aplicación de shell 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

Inserte la descripción de la imagen aquí

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的内容,再打印文本里面的内容

Inserte la descripción de la imagen aquí

Imprime la línea completa del número de línea

awk -F ":" '{print NR,$0}' /etc/passwd  #输出每行内容和行号,每处理完一条记录,NR值加1

Inserte la descripción de la imagen aquí

($ 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

Inserte la descripción de la imagen aquí

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{}语句块中,往往会放入打印结果等语句

Inserte la descripción de la imagen aquí

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)}' #查看当前内存使用百分比

Inserte la descripción de la imagen aquí

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次的输出结果)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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命令,并用来统计在线用户数

Inserte la descripción de la imagen aquí

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}'   获取偶数行

Inserte la descripción de la imagen aquí

Obtenga la dirección IP local
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_53567573/article/details/114846290
Recomendado
Clasificación