El comando de shell, el comando awk de tres espadachines, explicación detallada, comando de corte, registro del paradero en Linux (registro de operación)

1. Conozca el comando awk

AWK es un lenguaje para procesar archivos de texto y una poderosa herramienta de análisis de texto.
El origen del nombre AWK: los primeros caracteres del apellido de los tres fundadores Alfred Aho, Peter Weinberger y Brian Kernighan.

Comparación de tres comandos de shell de Musketeer:
grep es más adecuado para búsqueda simple o texto coincidente;
sed es más adecuado para editar texto coincidente;
awk es más adecuado para formatear texto, y el texto se procesa en un formato más complicado.

1.1 Principio de funcionamiento de awk

El comando awk es el mismo que sed, y lee y procesa línea por línea.
Sed actúa sobre el procesamiento de una línea completa, y awk divide una línea en varios campos para su procesamiento.
El flujo de trabajo de awk se puede dividir en tres partes:
el segmento de código ejecutado antes de leer el archivo de entrada (identificado por la palabra clave BEGIN); el segmento de código ejecutado por el
bucle principal para ejecutar el archivo de entrada;
y el segmento de código después de leer el archivo de entrada (identificado por la palabra clave END).

Gráfico: El breve flujo de procesamiento del comando awk:
Inserte la descripción de la imagen aquí

  1. Ejecute las declaraciones en el bloque de instrucciones BEGIN {comandos};
  2. Lea la línea 1 del archivo o stdin;
  3. Con o sin coincidencia de patrones, si no, ejecute la instrucción en {};
  4. Si es así, verifique si la línea completa coincide con el patrón. Si coincide, ejecute la instrucción en {};
  5. Si no hay coincidencia, la instrucción en {} no se ejecuta y luego se lee la siguiente línea;
  6. Repita este proceso hasta que se lean todas las líneas;
  7. Ejecute las instrucciones en el bloque de instrucción END {comandos}.

1.2 Sintaxis y descripción del parámetro

La sintaxis completa del comando awk

awk [parámetro de opción] Archivo 'BEGIN {comandos} patrón {comandos} FINALIZAR {comandos}'

Parámetros de opción:

-F especifica el separador de plegado del archivo de entrada, seguido de una cadena o una expresión regular, como -F:.
-v Asigna una variable definida por el usuario.
-f Lea el comando awk del archivo de script.
-mf nnn y -mr nnn establecen límites intrínsecos en los valores nnn, la opción -mf limita el número máximo de bloques asignados a nnn; la opción -mr limita el número máximo de registros. Estas dos funciones son extensiones de awk de Bell Labs y no están disponibles en awk estándar.
-W compacto o --compat, -W tradicional o --tradicional ejecutar awk en modo de compatibilidad. Entonces gawk se comporta exactamente como awk estándar, todas las extensiones awk son ignoradas.
-W copyleft o --copyleft, -W copyright o --copyright Imprime información corta de copyright.
-W ayuda o --help, -W uso o --usage Imprime todas las opciones awk y una breve descripción de cada opción.
-W lint o --lint Imprime advertencias para estructuras que no se pueden portar a plataformas Unix tradicionales.
-W lint-old o --lint-old Imprime una advertencia sobre estructuras que no se pueden portar a plataformas Unix tradicionales.
-W posix Activa el modo de compatibilidad. Sin embargo, tiene las siguientes restricciones y no se reconoce: / x, palabra clave de función, función, secuencia de escape, y cuando fs es un espacio, la nueva línea se usa como un separador de dominio; el operador y = no puede reemplazar y =; fflush no es válido.
-W re-intervalo o --re-inerval permite el uso de expresiones regulares de intervalo, consulte (clase de caracteres Posix en grep), como la expresión de corchete [[: alpha:]].
-W texto-programa fuente o - texto-programa fuente Utilice el texto-programa como código fuente, que se puede mezclar con el comando -f.
-W versión o --version Imprime la versión de la información del informe de error.

Ejemplo simple:
Ejemplo:

# cat passwd|awk -F: 'BEGIN{print "############"}$3<100{print $1,$3,$6}END{print "@@@@@@@@@@@@@@"}'
############
root 0 /root
dbus 81 /
rpc 32 /var/cache/rpcbind
rpcuser 29 /var/lib/nfs
haldaemon 68 /
postfix 89 /var/spool/postfix
mysql 27 /var/lib/mysql
@@@@@@@@@@@@@@

1.3 Uso básico de awk

Uso uno:

awk '/ pattern / {Action}' file # instrucción de coincidencia de línea awk '' solo puede usar comillas simples

Las instrucciones awk deben ir entre comillas simples.
Las acciones de Awk deben estar encerradas entre llaves.
El patrón puede ser una expresión regular, una expresión condicional o una combinación de ambas.
Si el patrón es una expresión regular, use el delimitador /.
Use un punto y coma para separar múltiples acciones.
Hay 2 tipos de separadores en awk:
1. Separador de entrada -F especifica
2. Separador de salida OFS =

Ejemplo:
Ejemplo 1: cuando solo hay modo, es equivalente a grep.

# cat passwd|awk '/liu/'
liu1:x:508:508::/home/liu1:/bin/bash
liu2:x:509:509::/home/liu2:/bin/bash

Ejemplo 2: cuando solo hay una acción, la acción se ejecuta directamente.

# who|awk '{print $2}'
tty1
pts/0
# who
root     tty1         2016-06-24 23:20
root     pts/0        2016-06-24 23:21 (liupeng.lan)

Uso 2: -F especifica el delimitador.

awk -F # Especifica el carácter dividido

Ejemplo 1: genera la primera y la séptima columna de la fila que comienzan con h.

# cat passwd|awk -F: '/^h/{print $1,$7}'
haldaemon /sbin/nologin

Ejemplo 4: mostrar la primera y la séptima columna de filas que no comienzan con h

awk -F: '/^[^h]/{print $1,$7}' /etc/passwd

Ejemplo 5: utilice los dos puntos o la barra diagonal izquierda como delimitador para mostrar las columnas primera y décima.

awk -F'[:/]' '{print $1,$10}' /etc/passwd

Uso 3: Establecer variables.

awk -v #set variable

Ejemplo 1:

# name=haha
# echo|awk -v abc=$name '{print abc,$name}'
haha 
# echo|awk -v abc=$name '{print $name}'

# echo|awk -v abc=$name '{print abc}'
haha    --》引用awk变量无需加$

Ejemplo 2

# name=haha;soft=xixi
# echo|awk -v abc=$name -v efg=$soft '{print abc,123}'
haha 123

Uso cuatro: -f script.

nombre de archivo de script awk -f

1.4 Operadores del comando awk

Las expresiones regulares son consistentes con bash.

Operaciones matemáticas: +, -, *, /,%, ++, -
Símbolos de relación lógica: &&, || ,!
Operadores de comparación:>, <,> = ,! =, <=, ==, ~ ( Coincide con expresiones regulares) ,! ~ (No concuerda con expresiones regulares)
expresiones de datos de texto: == (coincidencia exacta)
~ tilde indica que coincide con el patrón detrás

Ejemplo 1: si encuentra una coincidencia para / pts / en $ 2, generará $ 1.

# who | awk '$2 ~ /pts/{$1}' 

Ejemplo 2: El uid de salida es un nombre de usuario y uid de dos dígitos.

\ <Comience con.
\> Terminar con qué.
.. en la expresión regular representa dos caracteres.

[root@liupeng ~]# cat passwd|awk -F: '$3 ~/\<..\>/{print $1,$3}'
uucp 10
operator 11
games 12
gopher 13
......
[root@liupeng ~]# 

Ejemplo 3: números de salida de 1 a 10 divisibles por 5 o comenzando con 1.

[root@liupeng ~]# seq 10 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}'
1
5
10
[root@liupeng ~]# 

Ejemplo 4: muestre el nombre de usuario con uid mayor o igual a 50 y el directorio de inicio en / home mientras el shell termina con bash, uid, directorio de inicio, shell.

[root@liupeng ~]# cat passwd|awk -F: '$3>=50 && $6 ~/^\/home/ && $7 ~/bash/ {print $1,$3,$6,$7}'
mysql 496 /home/mysql /bin/bash
[root@liupeng ~]# 

Ejemplo 5: Encuentre el usuario cuyo nombre de usuario contiene liu, y envíe el nombre de usuario, uid y shell.

# cat passwd|awk -F':' '$1  ~/liu/{print $1,$3,$6}'
liu1 508 /home/liu1
liu2 509 /home/liu2
liu3 510 /home/liu3
liu4 511 /home/liu4
liu5 512 /home/liu5
liu 539 /home/liu

Ejemplo 6: Encuentre el usuario que contiene liu en el archivo / etc / passwd y usa bash.

# cat passwd|awk -F':' '$1 ~/liu/&&$7 ~/bash/{print $1,$7}'
liu1 /bin/bash
liu2 /bin/bash
liu3 /bin/bash
liu4 /bin/bash
liu5 /bin/bash
liu /bin/bash

1.5 Variables incorporadas del comando awk

$ 0 significa la línea completa de texto;
$ n significa el enésimo campo de datos en el texto;
NF: número de campo, que indica cuántos campos hay en una línea;
NR: número de registro, que indica el número de línea procesado actualmente;
FS: separador de campo, separación de entrada Descanso El valor predeterminado es en blanco (espacios y pestañas);
OFS: separador de campo externo, que indica el separador de salida, y reemplaza el carácter de línea con el símbolo especificado durante la salida;

el número de parámetros de
línea de comando ARGC ; la posición del archivo actual en la línea de comando ARGIND (a partir de 0) );
ARGV contiene una matriz de parámetros de línea de comando;
formato de conversión de número CONVFMT (el valor predeterminado es% .6g) matriz asociativa de la variable de entorno ENVIRON;
descripción ERRNO del último error del sistema;
lista de ancho de campo FIELDWIDTHS (separada por barra espaciadora);
archivo actual FILENAME Nombre;
Número de línea FNR de cada archivo contado por separado;
IGNORECASE si es verdadero, la coincidencia se ignora independientemente del caso;
Formato de salida del número OFMT (el valor predeterminado es% .6g);
Separador de registro de salida ORS (el valor predeterminado es un salto de línea );
RLENGTH La longitud de la cadena que coincide con la función de coincidencia;
separador de registro RS (el valor predeterminado es un carácter de nueva línea);
RSTART La primera posición de la cadena que coincide con la función de coincidencia;
separador de subíndice de matriz SUBSEP (valor predeterminado) Sí / 034).

Ejemplo 1: muestra el número de líneas en el archivo / etc / passwd.

[root@liupeng ~]# cat /etc/passwd|awk 'BEGIN{i=0}{i++} END{print i}'
35
[root@liupeng ~]#

Análisis: Se toma cada línea, i ++. El valor final de i es exactamente el número de líneas en el archivo passwd.

Ejemplo 2: utilice el separador predeterminado para mostrar el número de campos en cada fila.

[root@liupeng ~]# awk '{print NF}' /etc/passwd
1
1
1
1
......
[root@liupeng ~]# 

(Debido a que el separador no se especifica aquí, el separador predeterminado es un espacio, y naturalmente el número de campos es 1.)

Use los dos puntos como delimitador para mostrar el número de campos por línea.

[root@liupeng ~]# awk -F: '{print NF}' /etc/passwd
7
7
7
......
[root@liupeng ~]# 

(Se especifica el separador, que es 7)

Ejemplo 3: muestra el primer campo y el último campo de cada línea.

awk -F: '{print $1,$NF}' /etc/passwd

Ejemplo 4: muestra el número de línea y el contenido de cada línea.

[root@liupeng ~]# awk -F: '{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
[root@liupeng ~]# 

Ejemplo 5: Mostrar la primera y la séptima columna, separadas por ---

awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd

Redacción simple:

[root@liupeng ~]# awk -F: 'OFS="---"{print $1,$7}' /etc/passwd
root---/bin/bash
bin---/sbin/nologin
daemon---/sbin/nologin
......
[root@liupeng ~]# 

Ejemplo 6: Muestra el nombre de usuario y el número de línea que termina con bash, y finalmente muestra el número de línea total.

[root@liupeng ~]# awk 'BEGIN{FS=":"} /bash$/{print NR,$1} END{print NR}' /etc/passwd
1 root
35 mysql
35
[root@liupeng ~]# 

Ejemplo 7: Muestra de 3 a 5 líneas del archivo (número de línea, contenido).

[root@liupeng ~]# awk 'NR==3,NR==5{print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@liupeng ~]# 

Muestra 4 o 7 líneas (con número de línea y contenido).

[root@liupeng ~]# awk 'NR==4||NR==7{print NR,$0}' /etc/passwd
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@liupeng ~]# 

Ejemplo 8: Muestra las primeras 3 líneas del archivo (con número de línea y contenido).

[root@liupeng ~]# awk 'NR<=3{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@liupeng ~]# 

Ejemplo 9: Muestra las primeras 10 líneas y 30 a 40 líneas del archivo.

# awk 'NR<=10||NR>30&&NR<=40{print NR,$0}' /etc/passwd

Ejemplo 10: muestre los números de línea y los nombres de usuario de las líneas 5 y 10 del archivo passwd.

[root@liupeng ~]# cat passwd|awk -F: 'NR==5||NR==10{print NR,$1}'
5 lp
10 uucp
[root@liupeng ~]# 

Ejemplo 11:
1. Analice la diferencia entre los siguientes tres comandos y por qué.

#awk 'BEGIN{print NR}' /etc/passwd  (执行一次)
[root@liupeng ~]# awk 'BEGIN{print NR}' /etc/passwd
0
[root@liupeng ~]# 

#awk '{print NR}' /etc/passwd    (执行N次,N为行数)
(一直到35(最后一行))
[root@liupeng ~]# awk '{print NR}' /etc/passwd 
1
2
3
......
35
[root@liupeng ~]# 

#awk 'END{print NR}' /etc/passwd (执行一次,结果为文件的行数)

[root@liupeng ~]# awk 'END{print NR}' /etc/passwd 
35
[root@liupeng ~]# 

2. Analice los resultados de ejecución de los siguientes comandos
#awk -F: '{print $NR}'/etc/passwd
(Análisis: la línea 1 va al primer campo, la línea 2 toma el segundo campo, la línea n va al enésimo campo ...)
#awk -F: '{print NR, NF, $1, $NF, $(NF-1)}' /etc/passwd
(emite cada línea Número de línea, número de campo, nombre de usuario, último campo, penúltimo campo)

[root@liupeng ~]# awk -F: '{print NR, NF, $1, $NF, $(NF-1)}' /etc/passwd
1 7 root /bin/bash /root
2 7 bin /sbin/nologin /bin
3 7 daemon /sbin/nologin /sbin
......
35 7 mysql /bin/bash /home/mysql
[root@liupeng ~]# 

1.5.1 Awk ejercicio pequeño variable incorporado:

1. Use la variable NF para mostrar el contenido de la penúltima columna del archivo passwd.

cat passwd|awk -F: '{print $(NF-1)}'

2. Visualice el nombre de usuario en las líneas 5 a 10 en el archivo passwd.

cat passwd|awk -F: 'NR>=5&&NR<=10{print $1}'

3. Visualice el nombre de usuario de la séptima columna en el archivo passwd que no es bash.

cat passwd|awk -F: '$7 ~/[^bash]$/{print $1}' 

O:

cat passwd|awk -F: '$7 !~/bash/{print $1}'

4. Muestre que el número de línea en el archivo passwd es el número de línea y la línea que termina con 5.

cat passwd|awk -F: 'NR%10==5{print NR,$0}'

O:

cat passwd|awk -F: 'NR ~/5$/{print NR,$0}' 

5. Use ifconfig para mostrar solo ip (no se pueden usar los comandos tr o cut).

[root@liupeng ~]# ifconfig|awk -F: '/inet addr/{print $2}'|awk '{print $1}'
192.168.28.129
127.0.0.1
[root@liupeng ~]# 

O:

ifconfig |sed -n '/inet addr/p'|awk -F[:" "] '{print $13}'

6. Utilice awk para mostrar el tráfico entrante y saliente (bytes) de eth0.

ifconfig eth0|awk -F'[: ]' '/RX bytes/{print $13,$19}'

O

ifconfig eth0|tr -s ' '|awk -F'[: ]' '/RX bytes/{print $4,$9 }'

7. Use el comando awk para contar el número de usuarios que comienzan con r, y muestre los siguientes efectos.

Encuentra resultados para
root
rpc
rtkit
rpcuser
4

[root@liupeng ~]# cat passwd|awk -F: 'BEGIN{print "查找结果";i=0}/^r/{print $1;i++}END{print i}'
查找结果
root
rpc
rtkit
rpcuser
4
[root@liupeng ~]# 

1.6 Funciones incorporadas del comando awk

El lenguaje de programación Awk tiene muchas funciones integradas.

1.6.1 función de longitud

Ejemplo 1: Use la longitud para calcular el número de caracteres para verificar si hay una contraseña de usuario vacía.

awk -F: 'length($2)==0{print $1}' /etc/passwd /etc/shadow

Ejemplo 2: Mostrar líneas con más de 50 caracteres en el archivo.

awk 'length($0)>50{print NR,$0}' /etc/passwd

1.6.2 función del sistema

Ejemplo 1: utilice la función del sistema para configurar una contraseña para el usuario en el archivo.

# cat list.txt
xixi 123
haha 456
hehe 789
# awk '{system("useradd $1");print $1 "is add"}' list.txt
# awk '{system("echo "$2"|passwd --stdin  "$1)}'  list.txt

Ejemplo 2: utilice el comando del sistema awk para crear un directorio con el mismo nombre en / etc / passwd en / tmp / lp.

mkdir /tmp/lp/
awk -F: '{system("mkdir /tmp/lp/" $1)}' /etc/passwd

Ejemplo 3: use un comando para copiar objetos mayores de 10K en el directorio especificado a / tmp (buscar y para están prohibidos).

cp $(du -a  /boot | awk '$1>10240{print $2}') /tmp

1.7 Declaraciones estructuradas del comando awk

1.7.1 declaración if

1. rama única

[root@liupeng ~]# awk -F: '{if($1 ~ /\<...\>/)print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
[root@liupeng ~]# 
[root@liupeng ~]# awk -F: '{if($3 >= 500)print $1,$7}' /etc/passwd
nfsnobody /sbin/nologin
[root@liupeng ~]# 

2. Doble rama

awk -F: '{if($3 != 0) print $1 ; else print $3}' /etc/passwd

3. Multi-sucursal

awk -F: '{if($1=="root") print $1;else if($1=="ftp") print $2;else if($1=="mail") print $3;else print NR}' /etc/passwd

Ejemplo 2: Use awk's si hay múltiples ramas para determinar el tipo de usuario, la raíz se muestra como administrador, uid se muestra como usuario del sistema en (0,500), uid se muestra como un usuario normal entre [500,60000] y otro que no sea 60,000 Usuarios

[root@liupeng ~]# awk -F: '{if($3==0) print $1,"管理员";else if($3>0 && $3<500) print $1,"系统用户";else if($3>=500 && $3 <= 60000) print $1,"普通用户";else print $1,"其它用户"}' /etc/passwd
root 管理员
bin 系统用户
......
mysql 系统用户
[root@liupeng ~]# 

Suplemento:
tres métodos para obtener un líquido mayor de 500 y menor de 10000:

# cat /etc/passwd|awk -F: '$3>500&&$3<10000{print $1,$3}'
# cat /etc/passwd|awk -F: '($3>500&&$3<10000){print $1,$3}'
# cat /etc/passwd|awk -F: '{if($3>500&&$3<10000)print $1,$3}'

Ejercicio: supervise las particiones de disco de varios hosts. Una vez que la tasa de utilización de cualquier partición de un host supervisado sea superior al 80%, envíe una alerta por correo electrónico a root.

#!/bin/bash
warn=10
ip=(10.10.10.2 10.10.10.3)
for i in "${ip[@]}"
do
   ssh root@$i df -Ph | tr -s " "|awk -v w=10 -F "[ %]" '/^\/dev/{if($5>w) print  $1,$5"% useage is over 10%"}'>
alert
   if [ -s alert ]
   then
       sed -i "1i $i" alert &&  mail -s "$i hd usage" root < alert
   fi
done

Ejercicio: compruebe el archivo de registro / var / log / secure. Si un host no pudo conectarse al servidor con el servicio ssh del usuario raíz más de 10 veces (10 veces deben usar variables), agregue esta dirección IP al archivo /etc/hosts.deny y rechace Para su acceso, si esta IP ya existe, no es necesario agregarla al archivo /etc/hosts.deny repetidamente (requiere el uso de declaraciones awk para el filtrado de caracteres, el juicio de tamaño y la asignación de variables, y prohíbe el uso de comandos echo, sed, grep, cut, tr)

#/bin/bash
awk '/Failed password for root/{print $(NF-3)}' /var/log/secure|sort -nr| uniq -c > test        --》sort 按降序排序,uniq -c统计次数
NUM=10
IP=$(awk '$1>num {print $2}' num=$NUM test)    --》$1就是统计好的次数
for i in $IP
 do
   DENY=$(awk '$2==var {print $2}' var=$i /etc/hosts.deny)
   if [[ -z $DENY ]]
     then
      awk '$2==var {print "sshd: "$2}' var=$i test >> /etc/hosts.deny
      awk '$2==var {print "错误次数"$1,"拒绝"$2"访问"}' var=$i test
   else
      awk '$2==var {print "已经拒绝"$2"访问"}' var=$i test
   fi
done

1.7.2 Awk acumulación de filas y columnas

1.awk realiza la suma de columnas
Cuente el tamaño total de los archivos que terminan en .conf en el directorio / etc.

[root@liupeng ~]# find /etc/ -type f -name "*.conf" |xargs ls -l | awk '{sum+=$5} END{print sum}'
522341
[root@liupeng ~]# 
  1. Si desea hacer coincidir la primera columna para acumular, debe usar awk array y for loop (difícil).
cat xferlog | awk '{print $7,$8}' | sort -n >/lianxi/123.txt
awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}'/lianxi/123.txt | sort -rn -k2   

a [$ 1] = a [$ 1] + $ 2
[xferlog es un archivo de registro en el servidor ftp! ]
[Arrays Awk apoyan la cáscara en hablar matriz asociativa! !
【Ordenar -rn -k2 es contar la ip más descargada y ordenar]

3 Awk realiza la suma de filas.
Ejemplo 1: Encuentre la suma acumulativa de 1 ~ 5.

# echo 1 2 3 4 5 | awk '{for(i=1;i<=NF;i++) sum+=$i; print sum}'
15

Ejemplo 2: Encuentre la suma acumulativa de 1 ~ 100.

# seq -s ' ' 100 | awk '{for(i=1;i<=NF;i++) sum+=$i; print sum}'
5050

1.8 Cómo entender que la matriz en awk es una matriz asociativa:

1.8.1 ¿Cómo usar la matriz para almacenar datos en awk?

1. Almacene a todos los usuarios en / etc / passwd en la matriz de usuarios.

cat /etc/passwd|awk -F: '{user[$1]}'

Análisis: en este momento, no hay ningún valor en el usuario [raíz], pero el subíndice o índice se convierte en usuario [nombre de usuario].

cat /etc/passwd|awk -F: '{user[$1]=$3}'

Análisis: en este momento, el valor de $ 3 (es decir, uid) se asigna a la matriz del usuario [$ 1].
De esta manera, el usuario está asociado con el uid correspondiente al usuario, el nombre de usuario es una palabra clave de subíndice y el uid es el valor correspondiente al elemento de matriz.

1.8.2 ¿Cómo obtener datos de la matriz en awk?

Saque todos los valores en la matriz de usuario:

# cat /etc/passwd|awk -F: '{user[$1]=$3}END{for(i in user)print user[i],i}'
42 gdm
38 ntp
32 rpc
......

1.8.3 Comprensión de las matrices asociativas en awk (puntos difíciles):

{a [$ 1] + = $ 2}

El campo correspondiente a $ 1 se usa como subíndice, y el campo correspondiente a $ 2 se asigna al elemento con el campo correspondiente a $ 1. awk se ejecuta cada vez que se lee una línea, y el campo correspondiente a $ 1 se usa nuevamente como subíndice, y se ejecuta a [$ 1] = a [$ 1] + $ 2. Para lograr el efecto acumulativo. El campo correspondiente a $ 1 sigue siendo ese campo, pero los valores se han acumulado.

Escenarios aplicables: un escenario en el que una columna no cambia y el contenido de otra columna es diferente.

Ejercicio pequeño:
cuente cuánto dinero gastó cada persona en total y ordene en orden descendente de la cantidad total.

money.txt:
feng 100
feng 200
feng 360
li 100
li 150
zhang 90
zhang 88
# cat money.txt|awk '{username[$1]+=$2}END{for(i in username)print i,username[i]}'|sort -nr -k2
feng 660
li 250
zhang 178

1.8.4 si se juzga la matriz asociativa en awk

Ejemplo: Almacene el uid de todos los usuarios en / etc / passwd en una matriz. Si el nombre de usuario ingresado por el usuario está en la matriz, se genera el uid correspondiente a este usuario. El nombre de usuario se usa como subíndice; uid se usa como valor del elemento.

cat vim awk_user.sh:
[root@liupeng lp]# cat awk_user.sh 
#!/bin/bash
read -p "Please input the username:" u_name
cat /etc/passwd|awk -v U_name=$u_name -F: '{user[$1]=$3}END{if (U_name in user)print user[U_name]}'

[root@liupeng lp]# 
[root@liupeng lp]# sh awk_user.sh 
Please input the username:root
0
[root@liupeng lp]# sh awk_user.sh 
Please input the username:zhao
[root@liupeng lp]# 

2. El comando de corte

El comando cut corta bytes, caracteres y campos de cada línea del archivo y escribe estos bytes, caracteres y campos en la salida estándar.
Si no especifica el parámetro File, el comando cut leerá la entrada estándar. Se debe especificar uno de los distintivos -b, -c o -f.
Parámetros de corte:

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除。

3. Dónde registrar el paradero (registros de operaciones) en Linux

①history -c
② ~ / .bash_history
③ / var / log / secure
④ / var / log / lastlog
⑤ / var / log / wtmp

Supongo que te gusta

Origin www.cnblogs.com/lpeng94/p/12722635.html
Recomendado
Clasificación