GNU/Linux >> Tutoriales Linux >  >> Linux

8 potentes variables integradas de Awk:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

Este artículo es parte de la serie de ejemplos de tutoriales de Awk en curso. Awk tiene varias variables integradas poderosas. Hay dos tipos de variables integradas en Awk.

  1. Variable que define valores que se pueden cambiar, como separador de campo y separador de registro.
  2. Variable que se puede utilizar para el procesamiento y los informes, como número de registros, número de campos.

1. Ejemplo de Awk FS:variable separadora de campo de entrada.

Awk lee y analiza cada línea de la entrada en función del carácter de espacio en blanco de forma predeterminada y establece las variables $ 1, $ 2, etc. La variable Awk FS se usa para establecer el separador de campo para cada registro. Awk FS se puede establecer en cualquier carácter único o expresión regular. Puede usar el separador de campo de entrada usando una de las siguientes dos opciones:

  1. Usando la opción de línea de comando -F.
  2. Awk FS se puede configurar como una variable normal.
Syntax:

$ awk -F 'FS' 'commands' inputfilename

(or)

$ awk 'BEGIN{FS="FS";}'
  • Awk FS es cualquier carácter único o expresión regular que desee utilizar como separador de campo de entrada.
  • Awk FS se puede cambiar cualquier número de veces, conserva sus valores hasta que se cambia explícitamente. Si desea cambiar el separador de campo, es mejor cambiarlo antes de leer la línea. Entonces ese cambio afecta la línea de lo que lees.

Aquí hay un ejemplo de awk FS para leer el archivo /etc/passwd que tiene ":" como delimitador de campo.

$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}
{
	print $1"\t"$3"\t"$4"\t"$6;
}
END {
	print NR,"Records Processed";
}
$awk -f etc_passwd.awk /etc/passwd
Name    UserID  GroupID        HomeDirectory
gnats	41	41	/var/lib/gnats
libuuid	100	101	/var/lib/libuuid
syslog	101	102	/home/syslog
hplip	103	7	/var/run/hplip
avahi	105	111	/var/run/avahi-daemon
saned	110	116	/home/saned
pulse	111	117	/var/run/pulse
gdm	112	119	/var/lib/gdm
8 Records Processed

2. Ejemplo de Awk OFS:variable de separador de campo de salida

Awk OFS es un equivalente de salida de la variable awk FS. Por defecto, awk OFS es un carácter de un solo espacio. El siguiente es un ejemplo OFS awk.

$ awk -F':' '{print $3,$4;}' /etc/passwd
41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119

Concatenator en la declaración de impresión "," concatena dos parámetros con un espacio que es el valor de awk OFS por defecto. Por lo tanto, el valor Awk OFS se insertará entre los campos en la salida como se muestra a continuación.

$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd
41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=119

3. Ejemplo de Awk RS:variable de separador de registros

Awk RS define una línea. Awk lee línea por línea por defecto.

Supongamos que las calificaciones de los estudiantes se almacenan en un archivo, cada registro está separado por una nueva línea doble y cada campo está separado por un carácter de nueva línea.

$cat student.txt
Jones
2143
78
84
77

Gondrol
2321
56
58
45

RinRao
2122
38
37
65

Edwin
2537
78
67
45

Dayan
2415
30
47
20

Ahora, el siguiente script Awk imprime el nombre del estudiante y el Rollno del archivo de entrada anterior.

$cat student.awk
BEGIN {
	RS="\n\n";
	FS="\n";

}
{
	print $1,$2;
}

$ awk -f student.awk  student.txt
Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415

En el script student.awk, lee los detalles de cada estudiante como un solo registro, porque awk RS ha sido asignado para duplicar el carácter de nueva línea y cada línea en un registro es un campo, ya que FS es un carácter de nueva línea.

4. Ejemplo de Awk ORS:variable separadora de registros de salida

SRO rara es un equivalente de salida de RS. Cada registro en la salida se imprimirá con este delimitador. El siguiente es un ejemplo de ORS awk:

$  awk 'BEGIN{ORS="=";} {print;}' student-marks
Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=

En la secuencia de comandos anterior, cada registro en el archivo de calificaciones de los estudiantes está delimitado por el carácter “=”.

5. Ejemplo de Awk NR:número de registros variables

Awk NR le da el número total de registros que se están procesando o el número de línea. En el siguiente ejemplo de awk NR, la variable NR tiene un número de línea, en la sección FIN, awk NR le indica el número total de registros en un archivo.

$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks
Processing Record -  1
Processing Record -  2
Processing Record -  3
Processing Record -  4
Processing Record -  5
5 Students Records are processed

6. Ejemplo de Awk NF:número de campos en un registro

Awk NF le da el número total de campos en un registro. Awk NF será muy útil para validar si todos los campos existen en un registro.

Consideremos el archivo de calificaciones de los estudiantes, falta la puntuación de Test3 para los estudiantes, como se muestra a continuación.

$cat student-marks
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37
Edwin 2537 78 67 45
Dayan 2415 30 47

El siguiente script Awk, imprime el número de registro (línea) y el número de campos en ese registro. Por lo tanto, será muy sencillo descubrir que falta la puntuación de Test3.

$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4

7. Awk FILENAME Ejemplo:Nombre del archivo de entrada actual

La variable FILENAME proporciona el nombre del archivo que se lee. Awk puede aceptar una cantidad de archivos de entrada para procesar.

$ awk '{print FILENAME}' student-marks
student-marks
student-marks
student-marks
student-marks
student-marks

En el ejemplo anterior, imprime el NOMBRE DEL ARCHIVO, es decir, las calificaciones de los estudiantes para cada registro del archivo de entrada.

8. Ejemplo de Awk FNR:número de registros relativos al archivo de entrada actual

Cuando awk lee desde el archivo de entrada múltiple, la variable awk NR dará el número total de registros en relación con todo el archivo de entrada. Awk FNR le dará el número de registros para cada archivo de entrada.

$ awk '{print FILENAME, FNR;}' student-marks bookdetails
student-marks 1
student-marks 2
student-marks 3
student-marks 4
student-marks 5
bookdetails 1
bookdetails 2
bookdetails 3
bookdetails 4
bookdetails 5

En el ejemplo anterior, en lugar de awk FNR, si usa awk NR, para el archivo bookdetails obtendrá de 6 a 10 para cada registro.

Lecturas recomendadas

Sed y Awk 101 Hacks, por Ramesh Natarajan . Paso varias horas al día en un entorno UNIX/Linux lidiando con archivos de texto (datos, configuración y archivos de registro). Uso Sed y Awk para todo mi trabajo de manipulación de texto. Basado en mi experiencia con Sed y Awk, he escrito el libro electrónico Sed and Awk 101 Hacks que contiene 101 ejemplos prácticos sobre varias funciones avanzadas de Sed y Awk que mejorarán su vida en UNIX/Linux. Incluso si ha estado usando Sed y Awk durante varios años y no ha leído este libro, hágase un favor y lea este libro. Se sorprenderá con las capacidades de las utilidades Sed y Awk.


Linux
  1. una guía práctica para aprender awk

  2. Primeros pasos con awk, una poderosa herramienta de análisis de texto

  3. Una guía para principiantes de Gawk

  4. 9 potentes funciones incorporadas de Awk para numérico

  5. Usando grep vs awk

Cómo grabar screencasts en GNOME 3

Comando AWK en Linux con ejemplos

Comando Awk en Linux

¿Uso de guión (-) en lugar de un nombre de archivo?

Variable externa en Awk?

Variables de entorno de Linux