GNU/Linux >> Linux Esercitazione >  >> Linux

8 potenti variabili integrate Awk:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

Questo articolo fa parte della serie Awk Tutorial Examples in corso. Awk ha diverse potenti variabili integrate. Ci sono due tipi di variabili integrate in Awk.

  1. Variabile che definisce valori che possono essere modificati come separatore di campo e separatore di record.
  2. Variabile che può essere utilizzata per elaborazioni e rapporti come Numero di record, numero di campi.

1. Awk FS Esempio:campo di input variabile separatore.

Awk legge e analizza ogni riga dall'input in base allo spazio vuoto per impostazione predefinita e imposta le variabili $ 1, $ 2 e così via. La variabile Awk FS viene utilizzata per impostare il separatore di campo per ogni record. Awk FS può essere impostato su qualsiasi singolo carattere o espressione regolare. Puoi utilizzare il separatore del campo di input utilizzando una delle due seguenti opzioni:

  1. Utilizzo dell'opzione della riga di comando -F.
  2. Awk FS può essere impostato come una normale variabile.
Syntax:

$ awk -F 'FS' 'commands' inputfilename

(or)

$ awk 'BEGIN{FS="FS";}'
  • Awk FS è qualsiasi singolo carattere o espressione regolare che desideri utilizzare come separatore di campo di input.
  • Awk FS può essere modificato un qualsiasi numero di volte, mantiene i suoi valori fino a quando non viene modificato in modo esplicito. Se vuoi cambiare il separatore di campo, è meglio cambiare prima di leggere la riga. In modo che il cambiamento influisca sulla riga che leggi.

Ecco un esempio di awk FS per leggere il file /etc/passwd che ha ":" come delimitatore di 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. Awk OFS Esempio:variabile separatore campo di output

Awk OFS è un equivalente di output della variabile awk FS. Per impostazione predefinita, awk OFS è un singolo carattere spazio. Di seguito è riportato un esempio 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

Il concatenatore nell'istruzione print "", concatena due parametri con uno spazio che è il valore di awk OFS per impostazione predefinita. Quindi, il valore Awk OFS verrà inserito tra i campi nell'output come mostrato di seguito.

$ 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. Awk RS Esempio:variabile del separatore di record

Awk RS definisce una linea. Awk legge riga per riga per impostazione predefinita.

Supponiamo che i voti degli studenti siano archiviati in un file, ogni record sia separato da una doppia nuova riga e ogni campo sia separato da un nuovo carattere di riga.

$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

Ora lo script Awk sottostante stampa il nome dello studente e Rollno dal file di input sopra.

$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

Nello script student.awk, legge ogni dettaglio dello studente come un singolo record, perché awk RS è stato assegnato al doppio carattere di nuova riga e ogni riga in un record è un campo, poiché FS è un carattere di nuova riga.

4. Awk ORS Esempio:output della variabile di separazione dei record

Awk ORS è un equivalente in uscita di RS. Ogni record nell'output verrà stampato con questo delimitatore. Di seguito è riportato un esempio di awk ORS:

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

Nello script sopra, ogni record nel file file voti studenti è delimitato dal carattere “=”.

5. Awk NR Esempio:Numero di record variabili

Awk NR fornisce il numero totale di record in elaborazione o il numero di riga. Nel seguente esempio awk NR, la variabile NR ha un numero di riga, nella sezione END awk NR indica il numero totale di record in un file.

$ 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. Awk NF Esempio:numero di campi in un record

Awk NF ti dà il numero totale di campi in un record. Awk NF sarà molto utile per verificare se tutti i campi sono presenti in un record.

Prendiamo il file dei voti degli studenti, manca il punteggio Test3 per gli studenti come mostrato di seguito.

$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

Il seguente script Awk stampa il numero di record(riga) e il numero di campi in quel record. Quindi sarà molto semplice scoprire che manca il punteggio Test3.

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

7. Awk FILENAME Esempio:nome del file di input corrente

La variabile FILENAME fornisce il nome del file in lettura. Awk può accettare il numero di file di input da elaborare.

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

Nell'esempio sopra, stampa il FILENAME, ovvero i voti degli studenti per ogni record del file di input.

8. Esempio FNR Awk:numero di record relativi al file di input corrente

Quando awk legge dal file di input multiplo, la variabile awk NR fornirà il numero totale di record relativi a tutto il file di input. FNR awk ti darà il numero di record per ogni file di input.

$ 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

Nell'esempio sopra, invece di awk FNR, se usi awk NR, per il file bookdetails otterrai da 6 a 10 per ogni record.

Lettura consigliata

Sed e Awk 101 Hacks, di Ramesh Natarajan . Trascorro diverse ore al giorno in ambiente UNIX/Linux a occuparmi di file di testo (dati, configurazione e file di registro). Uso Sed e Awk per tutto il mio lavoro di manipolazione del testo. Sulla base della mia esperienza con Sed e Awk, ho scritto Sed and Awk 101 Hacks eBook che contiene 101 esempi pratici su varie funzionalità avanzate di Sed e Awk che miglioreranno la tua vita UNIX / Linux. Anche se usi Sed e Awk da diversi anni e non hai letto questo libro, per favore fatti un favore e leggi questo libro. Rimarrai stupito dalle capacità delle utility Sed e Awk.


Linux
  1. Utilizzo di trattino (-) al posto di un nome file?

  2. Variabile esterna in Awk?

  3. Tutorial Awk:Comprendi le variabili Awk con 3 esempi pratici

  4. 4 Esempi di istruzioni Awk If ( if, if else, if else if, :? )

  5. 7 potenti esempi di operatori Awk (operatori unario, binario, aritmetico, stringa, assegnazione, condizionale, Reg-Ex Awk)

Come registrare screencast in GNOME 3

Comando AWK in Linux con esempi

Comando Awk in Linux

Variabili d'ambiente Linux

È possibile utilizzare / in un nome file?

Spiegazione del comando awk utilizzando ORS, NR, FS, RS