- Linux
- OpenBSD
- FreeBSD
- Solaris
- bash/shell
- » ab
- » arp
- » arping
- » awk
- » bzip2, bunzip2, bzip2re...
- » chcase
- » chkconfig
- » chmod
- » chown
- » comm
- » convert
- » cat
- » cp
- » cpio
- » cryptsetup
- » curl
- » date
- » diff
- » dig
- » dumpe2fs
- » e2fsck(fsck.{ext2,ext3})
- » eval
- » exportfs
- » file
- » find
- » ftp
- » fuser
- » getfacl
- » grep, egrep, fgrep
- » grub
- » gzip, gunzip
- » hdparm
- » head
- » host
- » ifconfig
- » ifenslave
- » import
- » ionice
- » ip
- » ipcs, ipcrm
- » kill
- » ldconfig
- » ld
- » ldd
- » less
- » locale
- » locate
- » losetup
- » ls
- » lsmod
- » lsof
- » man
- » mke2fs(mkfs.{ext2,ext3})
- » mkinitrd
- » mknod
- » mkswap
- » modinfo
- » modprobe
- » mount
- » mtr
- » mv
- » mysql
- » mysqladmin
- » mysqldump
- » netstat
- » netstat-nat
- » nice
- » nc
- » nm
- » nslookup
- » objdump
- » openssl
- » parted
- » patch
- » perl
- » pg_dump
- » pidof
- » ping
- » pkg-config
- » ps
- » psql
- » rar
- » readelf
- » renice
- » rm
- » rmmod
- » route
- » rpcinfo
- » rpm
- » rsync
- » screen
- » sed
- » sendmail
- » seq
- » setfacl
- » sfdisk
- » showmount
- » shred
- » smartctl
- » smbclient
- » smbget
- » smbpasswd
- » socat
- » sort
- » sox
- » split
- » ssh
- » ssh-keygen
- » stat
- » stdbuf
- » strace
- » svn, svnadmin
- » systool
- » tail
- » tar
- » tcpdump
- » top
- » tr
- » tracepath
- » traceroute
- » tune2fs
- » udevcontrol, udevadm
- » unclutter
- » uniq
- » unzip
- » uuencode, uudecode
- » vim
- » vncviewer
- » vnstat
- » wc
- » wget
- » wput
- » xargs
- » xhost
- » xprop
- » xrandr
- » xwd
- » xxd
- » yum
- » zip, zip{cloak,note,split}
- KDE
- GTK
CONTENT
- CHANGES
Szukaj
#top awk / gawk ((GNU)awk)¶
- awk / gawk ((GNU)awk)
- SYNOPSIS
- DESCRIPTION
- OPTIONS
- Wywołanie programu awk
- Sposoby uruchamiania
- inline, w wierszu poleceń
- uruchomienie awk z plikiem
- uruchomienie skryptu awk
- sekcje BEGIN END
- Wybrane Opcje
- Wbudowane zmienne
- ARGC
- ARGIND
- ARGV
- CONVFMT
- ENVIRON
- ERRNO
- FIELDWIDTHS
- FILENAME
- FNR
- FS
- IGNORECASE
- LINT
- NF
- NR
- OFMT
- OFS
- ORS
- RS
- RT
- RSTART
- RLENGTH
- SUBSEP
- TEXTDOMAIN
- Instrukcje I/O
- close
- getline
- next
- nextfile
- printf
- system
- fflush
- Funkcje numeryczne
- atan2
- cos
- exp
- int
- log
- rand
- sin
- sqrt
- srand
- Funkcje łańcuchowe
- asort
- gensub
- gsub
- index
- length
- match
- split
- sprintf
- strtonum
- sub
- substr
- tolower
- toupper
- Funkcje czasu
- mktime
- strftime
- systime
- Funkcje operujące na bitach
- and
- compl
- lshift
- or
- rshift
- xor
- Funkcje internacjonalizacji
- bindtextdomain
- dcgettext
- FUNKCJE UŻYTKOWNIKA
- Przykładowa funkcja użytkownika
gawk - pattern scanning and processing language
Powiązane:
awk, perl,
#top SYNOPSIS¶
SYNOPSIS
gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...
pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...
pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...
#top DESCRIPTION¶
DESCRIPTION#top OPTIONS¶
OPTIONS
Gawk accepts the following options, listed alphabetically.
-F fs
--field-separator fs
-v var=val
--assign var=val
-f program-file
--file program-file
-mf NNN
-mr NNN
-W compat
-W traditional
--compat
--traditional
-W copyleft
-W copyright
--copyleft
--copyright
-W dump-variables[=file]
--dump-variables[=file]
-W exec file
--exec file
-W gen-po
--gen-po
-W help
-W usage
--help
--usage
-W lint[=value]
--lint[=value]
-W lint-old
--lint-old
-W non-decimal-data
--non-decimal-data
-W posix
--posix
-W profile[=prof_file]
--profile[=prof_file]
-W re-interval
--re-interval
-W source program-text
--source program-text
-W version
--version
--
In compatibility mode, any other options are flagged as invalid, but are otherwise ignored. In normal operation, as long as program text has been supplied, unknown options are passed on to the AWK program in the ARGV array for processing. This is particularly useful for running
AWK programs via the "#!" executable interpreter mechanism.
-F fs
--field-separator fs
Use fs for the input field separator (the value of the FS prede fined variable).
-v var=val
--assign var=val
Assign the value val to the variable var, before execution of the program begins. Such variable values are available to the BEGIN block of an AWK program.
-f program-file
--file program-file
Read the AWK program source from the file program-file, instead of from the first command line argument. Multiple -f (or --file) options may be used.
<divindent50>
<divindent50>
-mf NNN
-mr NNN
Set various memory limits to the value NNN. The f flag sets the maximum number of fields, and the r flag sets the maximum record size. These two flags and the -m option are from the Bell Laboratories research version of UNIX awk. They are ignored by gawk, since gawk has no pre-defined limits.
-W compat
-W traditional
--compat
--traditional
Run in compatibility mode. In compatibility mode, gawk behaves identically to UNIX awk; none of the GNU-specific extensions are recognized. The use of --traditional is preferred over the other forms of this option. See GNU EXTENSIONS, below, for more information.
-W copyleft
-W copyright
--copyleft
--copyright
Print the short version of the GNU copyright information message on the standard output and exit successfully.
-W dump-variables[=file]
--dump-variables[=file]
Print a sorted list of global variables, their types and final values to file. If no file is provided, gawk uses a file named awkvars.out in the current directory.
Having a list of all the global variables is a good way to look for typographical errors in your programs. You would also use this option if you have a large program with a lot of functions, and you want to be sure that your functions don’t inadvertently use global variables that you meant to be local. (This is a particularly easy mistake to make with simple variable names like i, j, and so on.)
Having a list of all the global variables is a good way to look for typographical errors in your programs. You would also use this option if you have a large program with a lot of functions, and you want to be sure that your functions don’t inadvertently use global variables that you meant to be local. (This is a particularly easy mistake to make with simple variable names like i, j, and so on.)
-W exec file
--exec file
Similar to -f, however, this is option is the last one processed. This should be used with #! scripts, particularly for CGI applications, to avoid passing in options or source code (!) on the command line from a URL. This option disables commandline variable assignments.
-W gen-po
--gen-po
Scan and parse the AWK program, and generate a GNU .po format file on standard output with entries for all localizable strings in the program. The program itself is not executed. See the GNU gettext distribution for more information on .po files.
-W help
-W usage
--help
--usage
Print a relatively short summary of the available options on the standard output. (Per the GNU Coding Standards, these options cause an immediate, successful exit.)
-W lint[=value]
--lint[=value]
Provide warnings about constructs that are dubious or nonportable to other AWK implementations. With an optional argument of fatal, lint warnings become fatal errors. This may be drastic, but its use will certainly encourage the development of cleaner AWK programs. With an optional argument of invalid, only warnings about things that are actually invalid are issued. (This is not fully implemented yet.)
-W lint-old
--lint-old
Provide warnings about constructs that are not portable to the original version of Unix awk.
-W non-decimal-data
--non-decimal-data
Recognize octal and hexadecimal values in input data. Use this option with great caution!
-W posix
--posix
This turns on compatibility mode, with the following additional restrictions:
\x escape sequences are not recognized.
Only space and tab act as field separators when FS is set to a single space, newline does not.
You cannot continue lines after ? and :.
The synonym func for the keyword function is not recognized.
The operators ** and **= cannot be used in place of ^ and ^=.
The fflush() function is not available.
\x escape sequences are not recognized.
Only space and tab act as field separators when FS is set to a single space, newline does not.
You cannot continue lines after ? and :.
The synonym func for the keyword function is not recognized.
The operators ** and **= cannot be used in place of ^ and ^=.
The fflush() function is not available.
-W profile[=prof_file]
--profile[=prof_file]
Send profiling data to prof_file. The default is awkprof.out. When run with gawk, the profile is just a "pretty printed" version of the program. When run with pgawk, the profile contains execution counts of each statement in the program in the left margin and function call counts for each user-defined function.
-W re-interval
--re-interval
Enable the use of interval expressions in regular expression matching (see Regular Expressions, below). Interval expressions were not traditionally available in the AWK language. The POSIX standard added them, to make awk and egrep consistent with each other. However, their use is likely to break old AWK programs, so gawk only provides them if they are requested with this option, or when --posix is specified.
-W source program-text
--source program-text
Use program-text as AWK program source code. This option allows the easy intermixing of library functions (used via the -f and --file options) with source code entered on the command line. It is intended primarily for medium to large AWK programs used in shell scripts.
-W version
--version
Print version information for this particular copy of gawk on the standard output. This is useful mainly for knowing if the current copy of gawk on your system is up to date with respect to whatever the Free Software Foundation is distributing. This is also useful when reporting bugs. (Per the GNU Coding Standards, these options cause an immediate, successful exit.)
--
Signal the end of options. This is useful to allow further argu ments to the AWK program itself to start with a "-". This is mainly for consistency with the argument parsing convention used by most other POSIX programs.
In compatibility mode, any other options are flagged as invalid, but are otherwise ignored. In normal operation, as long as program text has been supplied, unknown options are passed on to the AWK program in the ARGV array for processing. This is particularly useful for running
AWK programs via the "#!" executable interpreter mechanism.
#top Wywołanie programu awk¶
gawk wywołuje programy AWK w następującej kolejności. Najpierw dokonuje wszelkich inicjalizacji zmiennych, zadanych w opcjach -v. Następnie kompiluje program do postaci wewnętrznej. Potem wywołuje kod, zawarty w blokach BEGIN (jeśli istnieją), a następnie zaczyna odczytywać każdy z plików, podanych w tablicy ARGV. Jeśli nie podano takich nazw plików, gawk odczytuje standardowe wejście. Jeśli nazwa pliku w wierszu poleceń ma postać var=val, to jest traktowana jako inicjalizacja zmiennej. Zmienna var uzyska wartość val. (Dzieje się to po uruchomieniu każdego bloku BEGIN.) Ten sposób inicjalizowania zmiennych najbardziej przydaje się do dynamicznego nadawania wartości zmiennym, których AWK używa do określania sposobu, w jaki wejście rozbijane jest na pola i rekordy. Jest też użyteczny do kontroli stanu, jeśli zachodzi potrzeba wielokrotnego czytania danego pliku danych. Jeśli wartość konkretnego elementu ARGV jest pusta (""), to gawk ją pomija. Dla każdego rekordu wejścia gawk dokonuje porównania, sprawdzając czy odpowiada on jakiemuś wzorcowi z programu AWK. Jeśli wzorzec będzie odpowiadał rekordowi, zostanie wykonana związana z nim akcja. Wzorce są sprawdzane w kolejności ich pojawienia się w programie. Na koniec, gdy wyczerpane zostanie całe wejście, gawk wywołuje kod zawarty w bloku END.
#top Sposoby uruchamiania¶
#top inline, w wierszu poleceń¶
wystarczy awk wywołać w następujący sposób:
echo -en "line1\nline2\nline3\n" | awk '{print($0);}'
w rezultacie na ekranie pojawi się:
line1 line2 line3
#top uruchomienie awk z plikiem¶
w pliku o nazwie
awkscript.awk
należy umieścic następującą zawartość:{ print($0); }
a następnie wywołać w następujący sposób:
echo -en "line1\nline2\nline3\n" | awk -f awkscript.awk
w rezultacie na ekranie pojawi się:
line1 line2 line3
#top uruchomienie skryptu awk¶
najpierw należy nadać atrybut wykonywania pliku
awkscript.awk
zawierającego skrypt awk:chmod a+x awkscript.awk
następnie w pierwszej linijce należy umieścić ścieżkę do programu awk, który będzie służył do uruchamiania skryptu zapisanego w pliku
awkscript.awk
:#!/bin/awk -f { print($0); }
a następnie wywołać plik ze skryptem w następujący sposób:
echo -en "line1\nline2\nline3\n" | ./awkscript.awk
w rezultacie na ekranie pojawi się:
line1 line2 line3
#top sekcje BEGIN END¶
BEGIN
i END
są dwoma specjalnymi rodzajami wzorców, które nie są porównywane z danymi wejściowymi. Części akcji wszelkich wzorców BEGIN
są łączone, tak jakby wszystkie one zostały napisane w pojedynczym bloku BEGIN
. Są one wykonywane przed rozpoczęciem odczytywania danych wejściowych. Podobnie, wszelkie bloki END
są również łączone i wykonywane po wyczerpaniu danych wejściowych. (lub po dojściu do instrukcji exit.) Wzorce BEGIN
i END
nie mogą być łączone z innymi wzorcami w wyrażeniach wzorcowych. Wzorcom BEGIN
i END
nie może brakować części definiującej akcję.Przed rozpoczęciem czytania wejścia gawk wywołuje kod, zawarty w blokach
BEGIN
(jeśli istnieje), następnie czyta wejście, po wyczerpaniu wejścia, gawk wywołuje kod zawarty w bloku END
(jeśli również istnieje). Sekcja BEGIN
doskonale nadaje się do inicjalizacji zmiennych. Sekcja END
doskonale nadaje się do wyświetlenia wyników działania programu po zakończeniu przetwarzania wejścia.Przykład: sposób wywołania:
echo -en "ola\nala\nela\nula\nend\n" | awk 'BEGIN{countlines=0;}{countlines=countlines+1;}END{print("countlines="countlines);}'
countlines=5
#top Wybrane Opcje¶
-f plik-programu
--file=plik-programu
Odczytaj źródło programu AWK z pliku plik-programu, zamiast odczytywać go z pierwszego argumentu wiersza poleceń.
Można użyć wielu opcji -f (lub --file).
Przykład: zawartość pliku
awkscript.awk
:{ print($0); }
sposób wywołania:
echo -en "line1\nline2\nline3\n" | awk -f awkscript.awk
-v var=val
--assign=var=val
Przyznaje zmiennej var wartość val. Robi to przed uruchomieniem programu.
Takie wartości zmiennych są dostępne dla bloku BEGIN programu AWK.
Przykład: sposób wywołania:
echo -en "line1\nline2\nline3\n" | awk -v variable=value '{print(variable"="$0);}'
value=line1 value=line2 value=line3
Przykład: zawartość pliku
awkscript.awk
:{ print(variable"="$0); }
sposób wywołania:
echo -en "line1\nline2\nline3\n" | awk -v variable=value -f awkscript.awk
echo -en "line1\nline2\nline3\n" | awk -f awkscript.awk -v variable=value
echo -en "line1\nline2\nline3\n" | awk -f awkscript.awk variable=value
Rezultat:
line1 line2 line3
-F fs
--field-separator=fs
Używa fs jako wejściowego separatora pola (wartość predefiniowanej zmiennej FS).
Przykład: sposób wywołania:
echo "1|2|3|4|5" | awk -F '|' '{print($1"
1
Przykład: alternatywny sposób:
echo "1|2|3|4|5" | awk 'BEGIN{FS="|";}{print($1"
1
-W lint[=fatal]
--lint[=fatal]
Daje ostrzeżenia o konstrukcjach, które są pokraczne lub nieprzenośne dla innych implementacji AWK. Z opcjonalnym argumentem fatal, ostrzeżenia lint stają się błędami krytycznymi. Może to drastyczne, ale korzystanie z tej opcji na pewno zachęci do pisania czystszych programówr AWK.
#top Wbudowane zmienne¶
#top ARGC¶
ARGC
Liczba argumentów wiersza poleceń (nie liczy opcji przekazanych gawk, ani źródła programu).
Przykład: sposób wywołania:
echo | awk -v variable=value '{print("ARGC="ARGC);}'
ARGC=1
Przykład: sposób wywołania:
echo | awk -v var1=val1 -v var2=val2 -v var3=val3 'BEGIN{for(i=0;i<=ARGC;i++){print("ARGV["i"]="ARGV[i]);}} {print("ARGC="ARGC);}'Rezultat:
ARGV[0]=awk ARGV[1]= ARGC=1
Przykład: sposób wywołania:
awk 'BEGIN{for(i=0;i<=ARGC;i++){print("ARGV["i"]="ARGV[i]);}} {print("ARGC="ARGC" ARGIND="ARGIND" ARGV["ARGIND"]="ARGV[ARGIND]" $0="$0);}' file1 file2
zawartość pliku
file1
:file1:row1 file1:row2 file1:row3
zawartość pliku
file2
:file2:row1 file2:row2 file2:row3
Rezultat:
ARGV[0]=awk ARGV[1]=file1 ARGV[2]=file2 ARGV[3]= ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row1 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row2 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row3 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row1 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row2 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row3
#top ARGIND¶
ARGIND
Indeks w tablicy
ARGV
bieżąco przetwarzanego pliku.Przykład: sposób wywołania:
awk 'BEGIN{for(i=0;i<=ARGC;i++){print("ARGV["i"]="ARGV[i]);}} {print("ARGC="ARGC" ARGIND="ARGIND" ARGV["ARGIND"]="ARGV[ARGIND]" $0="$0);}' file1 file2
zawartość pliku
file1
:file1:row1 file1:row2 file1:row3
zawartość pliku
file2
:file2:row1 file2:row2 file2:row3
Rezultat:
ARGV[0]=awk ARGV[1]=file1 ARGV[2]=file2 ARGV[3]= ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row1 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row2 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row3 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row1 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row2 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row3
#top ARGV¶
ARGV
Tablica argumentów wiersza poleceń. Tablica ta jest indeksowana od zera do ARGC
zawartość pliku
file1
:file1:row1 file1:row2 file1:row3
zawartość pliku
file2
:file2:row1 file2:row2 file2:row3
Przykład: sposób wywołania:
awk 'BEGIN{for(i=0;i<=ARGC;i++){print("ARGV["i"]="ARGV[i]);}} {print("ARGC="ARGC" ARGIND="ARGIND" ARGV["ARGIND"]="ARGV[ARGIND]" $0="$0);}' file1 file2
ARGV[0]=awk ARGV[1]=file1 ARGV[2]=file2 ARGV[3]= ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row1 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row2 ARGC=3 ARGIND=1 ARGV[1]=file1 $0=file1:row3 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row1 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row2 ARGC=3 ARGIND=2 ARGV[2]=file2 $0=file2:row3
#top CONVFMT¶
CONVFMT
Format konwersji dla liczb, domyślnie "%.6g".
#top ENVIRON¶
ENVIRON
Tablica zawierająca wartości bieżącego środowiska. Tablica ta jest indeksowana zmiennymi środowiskowowymi, każdy element tablicy jest wartością danej zmiennej (np. ENVIRON["HOME"] może mieć wartość /u/arnold). Zmiana tej tablicy nie wpłynie na środowisko widziane przez programy, które gawk wywołuje przez przekierowania lub przy użyciu funkcji system().
Przykład: sposób wywołania:
echo | awk '{print("ENVIRON[\"HOME\"]="ENVIRON["HOME"]);}'
ENVIRON["HOME"]=/home/user
#top ERRNO¶
ERRNO
Jeśli pojawi się błąd systemowy podczas przekierowywania dla getline, podczas odczytu dla getline lub podczas close(), to ERRNO będzie zawierać łańcuch opisujący błąd. Podlega on tłumaczeniu przy ustawieniach locale innych niż angielskie.
Przykład: sposób wywołania:
#top FIELDWIDTHS¶
FIELDWIDTHS
Jest rozdzieloną białymi spacjami listą szerokości pól. Jeśli zmienna ta jest ustawiona, to gawk rozbija wejście na pola o stałych szerokościach (domyślnie rozbija je według wartości separatora FS).
#top FILENAME¶
FILENAME
Nazwa pliku bieżącego pliku wejściowego. Jeśli nie podano plików w wierszu poleceń, FILENAME przechowuje wartość "-". Wartość zmiennej FILENAME jest niezdefiniowana wewnątrz bloku BEGIN (chyba że zostanie nadana przez getline).
#top FNR¶
FNR
Liczba rekordów wejściowych w bieżącym pliku wejściowym.
Przykład: sposób wywołania:
echo -en "a\na b\na b c\na b c d\na b c d e\n" | awk '{print("NF="NF" $0="$0);}'
NF=1 $0=a NF=2 $0=a b NF=3 $0=a b c NF=4 $0=a b c d NF=5 $0=a b c d e
#top FS¶
FS
Separator pól wejściowych, domyślnie spacja.
Przykład: sposób wywołania:
echo "1|2|3|4|5" | awk 'BEGIN{FS="|";}{print("$1="$1" $2="$2" $3="$3" $4="$4" $5="$5);}'
$1=1 $2=2 $3=3 $4=4 $5=5
#top IGNORECASE¶
IGNORECASE
Określa wrażliwość na wielkości znaków w operacjach na wyrażeniach regularnych. Jeśli zmienna IGNORECASE ma wartość niezerową, to porównywanie wzorców w regułach, rozdzielanie pól przez FS, rozdzielanie rekordów przez RS, dopasowywanie wyrażeń regularnych przez ~ i !~, oraz wbudowane funkcje gsub(), index(), match(), split() i sub(), będą ignorować wielkość liter podczas operacji na wyrażeniach regularnych. UWAGA: Ustawienie to nie wpływa na indeksowanie tablic, ani na funkcję asort(). Tak więc jeśli IGNORECASE nie jest równe zero, /aB/ odpowiada wszystkim następującym łańcuchom -- "ab", "aB", "Ab", i "AB". Jak ze wszystkimi zmiennymi AWK, początkowa wartość IGNORECASE jest zerem, więc operacje na wyrażeniach regularnych są wrażliwe na wielkość znaków. W Unixie przy ignorowaniu wielkości znaków używany jest pełny zestaw znaków ISO-8859-1 Latin-1.
#top LINT¶
LINT
Zapewnia dynamiczne sterowanie opcją --lint z wnętrza programu AWK. Gdy jest prawdziwe, gawk wypisuje ostrzeżenia lint. Gdy fałszywe -- nie wypisuje. Kiedy ma przypisaną wartość łańcuchową "fatal", ostrzeżenia lint stają się błędami krytycznymi, dokłądnie tak samo, jak przy --lint=fatal. Każda inna wartość prawdziwa wypisuje tylko ostrzeżenia.
#top NF¶
NF
Liczba pól w bieżącym rekordzie wejściowym.
Przykład: sposób wywołania:
echo -en "a\na b\na b c\na b c d\na b c d e\n" | awk '{print("NR="NR" NF="NF" $0="$0);}'
NR=1 NF=1 $0=a NR=2 NF=2 $0=a b NR=3 NF=3 $0=a b c NR=4 NF=4 $0=a b c d NR=5 NF=5 $0=a b c d e
#top NR¶
NR
Całkowita liczba odczytanych do tej pory rekordów wejściowych.
Przykład: sposób wywołania:
echo -en "a\na b\na b c\na b c d\na b c d e\n" | awk '{print("NR="NR" NF="NF" $0="$0);}'
NR=1 NF=1 $0=a NR=2 NF=2 $0=a b NR=3 NF=3 $0=a b c NR=4 NF=4 $0=a b c d NR=5 NF=5 $0=a b c d e
#top OFMT¶
OFMT
Format wyjściowy liczb, domyślnie "%.6g".
#top OFS¶
OFS
Separator pól wyjściowych, domyślnie spacja.
Przykład: sposób wywołania:
echo -en "a\na b\na b c\na b c d\na b c d e\n" | awk 'BEGIN{OFS="-";}{print("NR="NR" $1="$1" $0="$0);}'
NR=1 NF=1 $0=a NR=2 NF=2 $0=a b NR=3 NF=3 $0=a b c NR=4 NF=4 $0=a b c d NR=5 NF=5 $0=a b c d e
W powyższym przykładzie zainicjowanie OFS nie odniosło skutku, jak widać poniżej należy zmodyfikować mininum jedno pole aby uzyskać oczekiwany rezultat.
Przykład: sposób wywołania:
echo -en "a\na b\na b c\na b c d\na b c d e\n" | awk 'BEGIN{OFS="-";}{$1=$1;print("NR="NR" $1="$1" $0="$0);}'
NR=1 $1=a $0=a NR=2 $1=a $0=a-b NR=3 $1=a $0=a-b-c NR=4 $1=a $0=a-b-c-d NR=5 $1=a $0=a-b-c-d-e
#top ORS¶
ORS
Separator rekordów wyjściowych, domyślnie nowa linia.
PROCINFO
Elementy tej tablicy umożliwiają dostęp do informacji o działającym programie AWK. W niektórych systemach w tablicy mogą istnieć elementy od "group1" aż do "groupn" dla pewnego n, będącego liczbą grup dodatkowych, do których należy program. Do sprawdzenia tych elementów użyj operatora in. Na pewno są dostępne następujące elementy:PROCINFO["egid"]
wartość funkcji systemowej getegid(2).PROCINFO["euid"]
wartość funkcji systemowej geteuid(2).PROCINFO["FS"]
"FS", jeśli działa podział na pola za pomocą FS
, lub "FIELDWIDTHS"
, jeśli działa podział na pola za pomocą FIELDWIDTHS
.PROCINFO["gid"]
wartość funkcji systemowej getgid(2).PROCINFO["pgrpid"]
ID grupy procesów bieżącego procesu.PROCINFO["pid"]
ID bieżącego procesu.PROCINFO["ppid"]
ID procesu macierzystego dla bieżącego procesu.PROCINFO["uid"]
wartość funkcji systemowej getuid(2).#top RS¶
RS
Separator rekordów wejściowych, domyślnie nowa linia. Jeśli
RS
ma wartość łańcucha zerowego, to rekordy są oddzielane pustymi liniami. Gdy RS
jest ustawiony na łańcuch zerowy, to znak nowej linii zawsze działa jak separator pola, oprócz działania jakiejkolwiek wartości zmiennej FS
.#top RT¶
RT
Zakończenie rekordu. Gawk ustawia RT na tekst wejściowy, który pasował do znaku lub wyrażenia regularnego określonego przez
RS
.#top RSTART¶
RSTART
Indeks pierwszego znaku, dopasowanego funkcją match(); 0 w przypadku braku dopasowania.
#top RLENGTH¶
RLENGTH
Długość łańcucha dopasowanego funkcją match(); -1 w przypadku braku dopasowania.
#top SUBSEP¶
SUBSEP
Znak, używany do separacji wielokrotnych indeksów w elementach tablicowych, domyślnie jest to "\034".
#top TEXTDOMAIN¶
TEXTDOMAIN
Dziedzina tekstowa programu AWK. Stosowane od odszukania zlokalizowanych tłumaczeń łańcuchów znakowych programu.
#top Instrukcje I/O¶
Instrukcje I/O są następujące:
#top close¶
close(plik [, jak])
Zamyka plik, potok lub proces współbieżny (co-process). Opcjonalnego jak powinno się używać wyłącznie do zamykania jednego końca dwukierunkowego potoku do procesu współbieżnego. Musi to być wartość łańcuchowa, albo "to" albo "from".
#top getline¶
getline
Ustawia $0 z następnego rekordu wejściowego; ustawia NF, NR, FNR.
getline <plik
Ustawia $0 z następnego rekordu pliku; ustawia NF.
getline var
Ustawia var z następnego rekordu wejściowego; ustawia NF, FNR.
getline var <plik
Ustawia var z następnego rekordu pliku.
polecenie | getline [var]
Uruchamia przesyłanie potokiem wyjścia polecenia albo do $0, albo do var, jak wyżej.
polecenie |& getline [var]
Uruchamia polecenia jako proces współbieżny, wysyłając potokiem jego wyjście albo do $0 albo do var, jak wyżej. Procesy współbieżne są rozszerzeniem gawk.
Przykład: sposób wywołania:
echo -en "ola\nala\nela\nula\nend\n" | awk 'BEGIN{print("BEGIN $0="$0);}{print("$0="$0);}'
BEGIN $0= $0=ola $0=ala $0=ela $0=ula $0=end
Przykład: sposób wywołania:
echo -en "ola\nala\nela\nula\nend\n" | awk 'BEGIN{getline;print("BEGIN $0="$0);}{print("$0="$0);}'
BEGIN $0=ola $0=ala $0=ela $0=ula $0=end
#top next¶
next
Kończy przetwarzanie bieżącego rekordu wejściowego. Następnie odczytywany jest kolejny rekord wejściowy i przetwarzanie rozpoczyna się od pierwszego wzorca programu AWK. Jeśli osiągnięto koniec danych wejściowych, wykonywany jest blok END.
#top nextfile¶
nextfile
Kończy przetwarzanie bieżącego pliku wejściowego. Następny rekord wejściowy zostanie odczytany z kolejnego pliku wejściowego. Aktualizowane są wartości FILENAME i ARGIND, zaś FNR jest ustawiane na 1 i przetwarzanie rozpoczyna się od pierwszego wzorca programu AWK. Jeśli osiągnięty zostanie koniec danych wejściowych, wykonywany jest blok END.
#top print¶
print
Wypisuje bieżący rekord. Rekord wyjściowy zakończony jest wartością zmiennej ORS.
print lista-wyrażeń
Wypisuje wyrażenia. Każde wyrażenie jest oddzielone wartością zmiennej OFS. Wyjściowy rekord jest kończony wartością zmiennej ORS.
print lista-wyrażeń >plik
Wypisuje wyrażenia do pliku. Każde wyrażenie jest rozdzielone wartością zmiennej OFS. Rekord wyjściowy jest zakończony wartością zmiennej ORS.
#top printf¶
printf fmt, lista-wyrażeń
Formatuje i wypisuje.
printf fmt, lista-wyrażeń >plik
Formatuje i wypisuje do pliku.
Przykład: sposób wywołania:
echo "ola 123" | awk '{printf("string($1)=%s int($2)=%d\n",$1,$2);}'
string($1)=ola int($2)=123
#top system¶
system(cmd-line)
Wywołuje polecenie systemowe cmd-line, i zwraca jego status wyjścia. (funkcja może nie być dostępna na systemach nie POSIX-owych.)
Przykład: sposób wywołania:
echo | awk '{system("awk --version");}'
wto lip 16 23:23:23 CEST 2013
#top fflush¶
fflush([plik])
Opróżnia bufory związane z otwartym plikiem wynikowym lub potokiem plik. Jeśli pominięto plik, to opróżniane jest standardowe wyjście. Jeżeli plik jest łańcuchem pustym, to opróżniane są bufory wszystkich otwartych plików i potoków.
#top Funkcje numeryczne¶
AWK ma następujące wbudowane funkcje arytmetyczne:
#top atan2¶
atan2(y, x)
zwraca arcus tangens y/x w radianach.
#top cos¶
cos(wyraż)
zwraca cosinus z wyraż w radianach.
#top exp¶
exp(wyraż)
funkcja wykładnicza.
#top int¶
int(wyraż)
skraca do liczby całkowitej.
#top log¶
log(wyraż)
funkcja logarytmu naturalnego.
#top rand¶
rand()
zwraca liczbę losową z przedziału 0 i 1.
#top sin¶
sin(wyraż)
zwraca sinus z wyraż w radianach.
#top sqrt¶
sqrt(wyraż)
pierwiastek kwadratowy.
#top srand¶
srand([wyraż])
Używa wyraż jako nowego nasionka dla generatora liczb losowych. Bez podanego wyraż, używany jest czas dnia. Wartość zwracana to poprzednie nasionko generatora liczb losowych.
#top Funkcje łańcuchowe¶
AWK ma następujące wbudowane funkcje łańcuchowe:
#top asort¶
asort(s [, d])
Zwraca liczbę elementów w źródłowej tablicy s. Zawartość s jest sortowana z zastosowaniem zwykłych reguł gawk do porównywania wartości, zaś indeksy posortowanych wartości s azstępowane są kolejnymi liczbami całkowitymi, począwszy od 1. Jeśli podano opcjonalną tablicę docelową d, to najpierw s jest powielana do d, a następnie sortowana jest d, a indeksy tablicy źródłowej s pozostają niezmienione.
Przykład: sposób wywołania:
echo | awk '{ARRAY[1]="ola";ARRAY[2]="ala";ARRAY[3]="ela";ARRAY[4]="ula"; count=asort(ARRAY); for(i=1;i<=count;i++){print("ARRAY["i"]="ARRAY[i]);} }'
ARRAY[1]=ala ARRAY[2]=ela ARRAY[3]=ola ARRAY[4]=ula
Przykład: sposób wywołania:
echo | awk '{ARRAY[1]="ola";ARRAY[2]="ala";ARRAY[3]="ela";ARRAY[4]="ula"; count=asort(ARRAY,ADEST); for(i=1;i<=count;i++){print("ARRAY["i"]="ARRAY[i]);} for(i=1;i<=count;i++){print("ADEST["i"]="ADEST[i]);} }'
ARRAY[1]=ola ARRAY[2]=ala ARRAY[3]=ela ARRAY[4]=ula ADEST[1]=ala ADEST[2]=ela ADEST[3]=ola ADEST[4]=ula
#top gensub¶
gensub(r, s, h [, t])
w łańcuchu docelowym t wyszukuje podłańcuchy odpowiadające wyrażeniu regularnemu r. Jeżeli h jest łańcuchem zaczynającym się od g lub G, to zastępuje wszystkie znalezione dopasowania r przez s. W przeciwnym wypadku, h jest liczbą wskazującą, które z kolejnych dopasowań r ma zostać zastąpione. Jeżeli nie podano t, to zami- ast niego używane jest $0. Wewnątrz tekstu zastępującego s, można posłużyć się sekwencją \n, gdzie n jest cyfrą od 1 do 9, wskazującą na tekst dopasowany przez n-te podwyrażenie w nawiasach. Sekwencja \0 oznacza cały dopasowany tekst, tak samo jak znak &. W przeciwieństwie do sub() i gsub(), jako wynik funkcji zwracany jest zmieniony łańcuch, zaś pierwotny łańcuch docelowy pozostaje nie zmieniony.
#top gsub¶
gsub(r, s, t)
każdy podłańcuch, odpowiadający wyrażeniu regularnemu r w łańcuchu t, wymienia na łańcuch s, i zwraca liczbę podmian. Jeśli nie podano t, używa $0. Znak & w tekście zastępującym zostanie zastąpiony faktycznie dopasowanym tekstem. Użyj \& by otrzymać literał &. (Musi to być wpisane jako "\\&". Pełniejsze omówienie reguł & oraz odwrotnych ukośników w tekście zastępującym dla funkcji sub(), gsub() i gensub() znajdziesz w pozycji GAWK: Efektywne programowanie w AWK.)
Przykład: sposób wywołania:
echo "ola1 ola2 ola3 ola4 ola5" | awk '{gsub("ola","ala",$0);print($0);}'
ala1 ala2 ala3 ala4 ala5
#top index¶
index(s, t)
zwraca indeks łańcucha t w łańcuchu s, lub zero, jeśli t nie zostało znalezione.
Przykład: sposób wywołania:
echo "ola2end" | awk '{print("index($0,\"end\")="index($0,"end"));}'
index($0,"end")=5
#top length¶
length(s)
zwraca długość łańcucha s lub długość $0, jeśli nie podano s.
Przykład: sposób wywołania:
echo ola | awk '{print("length($0)="length($0));}'
length($0)=3
#top match¶
match(s, r [, a])
zwraca pozycję w s, gdzie pojawia się wyrażenie regularne r. Jeśli nie podano r, zwracane jest zero. Jeśli jest jednak obecne, to dodatkowo ustawiane są zmienne RSTART i RLENGTH. Zauważ, że kolejność argumentów jest taka sama jak dla operatora ~: str ~ re. Jeśli podano tablicę a, to jest ona czyszczona a następnie elementy od 1 do n wypełniane są fragmentami s pasującymi do odpowiednich ujętych w nawiasy podwyrażeń z r. Zerowy element a zawiera fragment s dopasowany przez całe wyrażenie regularne r.
Przykład: sposób wywołania:
echo "Tel: 022 666 77 88" | awk '{str=$0;reg="[0-9][0-9 ]*$"; print("match(\""str"\",\""reg"\")="match(str,reg)" Tel="substr(str,match(str,reg)));}'
match("Tel: 022 666 77 88","[0-9][0-9 ]*$")=6 Tel=022 666 77 88
#top split¶
split(s, a, r)
dzieli łańcuch s na tablicę a w miejscach rozdzielonych wyrażeniem regularnym r, i zwraca liczbę pól. Jeśli pominięto r, zamiast niego używane jest FS. Na początku, tablica a jest czyszczona. Podział odbywa się identycznie jak opisany powyżej podział rekordu na pola.
Przykład: sposób wywołania:
echo "1-2-3-4-5" | awk '{count=split($0,A,"-");for(i=1;i<=count;i++){print("A["i"]="A[i]);}}'
A[1]=1 A[2]=2 A[3]=3 A[4]=4 A[5]=5
Przykład: sposób wywołania:
echo "ola1ala2ela3ula4end" | awk '{count=split($0,A,"[0-9]");for(i=1;i<=count;i++){print("A["i"]="A[i]);}}'
A[1]=ola A[2]=ala A[3]=ela A[4]=ula A[5]=end
#top sprintf¶
sprintf(fmt, lista-wyraż)
wypisuje listę-wyraż według fmt, i zwraca łańcuch wyjściowy.
Przykład: sposób wywołania:
echo "ola 123" | awk '{print(sprintf("string($1)=%s int($2)=%d",$1,$2));}'
string($1)=ola int($2)=123
#top strtonum¶
strtonum(str)
Bada str, i zwraca jego numeryczną wartość. Jeśli str zaczyna się od początkowego 0, to strtonum() przyjmuje, że str jest liczbą ósemkową. Jeśli str zaczyna się od początkowego 0x lub 0X, to strtonum() przyjmuje, że str jest liczbą szesnastkową.
Przykład: sposób wywołania:
echo "123" | awk '{printf("%d\n",strtonum($0));}'
123
Przykład: sposób wywołania:
echo "123.123" | awk '{printf("%d\n",strtonum($0));}'
123
Przykład: sposób wywołania:
echo "123.123" | awk '{printf("%f\n",strtonum($0));}'
123,000000
Przykład: sposób wywołania:
echo "123ola123" | awk '{printf("%d\n",strtonum($0));}'
123
Przykład: sposób wywołania:
echo "015" | awk '{printf("%d\n",strtonum($0));}'
13
Przykład: sposób wywołania:
echo "0x0A" | awk '{printf("%d\n",strtonum($0));}'
10
#top sub¶
sub(r, s, t)
Podobne do gsub(), lecz podmieniany jest tylko pierwszy odpowiadający podłańcuch.
Przykład: sposób wywołania:
echo "ola1 ola2 ola3 ola4 ola5" | awk '{sub("ola","ala",$0);print($0);}'
ala1 ola2 ola3 ola4 ola5
#top substr¶
substr(s, i, n)
zwraca maksymalnie n-znakowy podłańcuch łańcucha s, zaczynający się od pozycji i. Jeśli pominięto parametr n, użyta zostaje reszta s.
Przykład: sposób wywołania:
echo "zwraca maksymalnie n-znakowy podłańcuch łańcucha s" | awk '{print(substr($0,8));}'
maksymalnie n-znakowy podłańcuch łańcucha s
Przykład: sposób wywołania:
echo "zwraca maksymalnie n-znakowy podłańcuch łańcucha s" | awk '{print(substr($0,8,11));}'
maksymalnie
#top tolower¶
tolower(str)
zwraca kopię łańcucha str, w której wszystkie wielkie litery zostały zastąpione małymi. Nie alfabetyczne znaki pozostają bez zmian.
Przykład: sposób wywołania:
echo "NAZWA gawk SKŁADNIA gawk [opcje w stylu POSIX lub GNU] ..." | awk '{print(tolower($0));}'
nazwa gawk składnia gawk [opcje w stylu posix lub gnu] ...
#top toupper¶
toupper(str)
zwraca kopię łańcucha str, w której wszystkie małe litery zostały zastąpione wielkimi. Nie alfabetyczne znaki pozostają bez zmian.
Przykład: sposób wywołania:
echo "NAZWA gawk SKŁADNIA gawk [opcje w stylu POSIX lub GNU] ..." | awk '{print(toupper($0));}'
NAZWA GAWK SKŁADNIA GAWK [OPCJE W STYLU POSIX LUB GNU] ...
#top Funkcje czasu¶
Ponieważ jednym z podstawowych zadań programów AWK jest przetwarzanie plików z logami, które zawierają informacje czasowe, gawk udostępnia następujące funkcje, umożliwiające uzyskiwanie znaczników czasu (timestamps) i ich formatowanie.
#top mktime¶
mktime(danedaty)
Zamienia danedaty w znacznik czasu o tej postaci, co zwracana przez systime(). danedaty jest łańcuchem postaci YYYY MM DD HH MM SS[ DST]. Zawartością łańcucha jest sześć lub siedem liczb oznaczających odpowiednio: pełny rok łącznie ze stuleciem, miesiąc od 1 do 12, dzień miesiąca od 1 do 31, godzina od 0 do 23, minuta od 0 do 59, i sekunda od 0 do 60, oraz opcjonalna flaga zmiany czasu na letni. Wartości tych liczb nie muszą leżeć w podanych zakresach. Na przykład, godzina -1 oznacza 1 godziną przed północą. Przyjęto kalendarz gregoriański zaczynający się od zera, w którym rok 0 występuje przed rokiem 1, a rok -1 przed rokiem 0. Zakłąda się, że czas jest podany według lokalnej strefy czasowej. Jeśli flaga czasu letniego jest dodatnia, to czas jest czasem letnim. Jeśli jest zerowa, to standardowym. Jeśli jest ujemna (domyślne), to mktime() próbuje ustalić czy dla zadanego czasu funkcjonuje czas letni. Jeśli danedaty nie zawierają wystarczającej liczby elementów lub wyknikowy czas jest poza zakresem, to funkcja zwraca -1.
Przykład: sposób wywołania:
echo | awk '{ts=mktime("2001 02 03 04 05 06");print("ts="ts);print(strftime("%Y/%m/%d %H:%M:%S",ts));}'
ts=981169506 2001/02/03 04:05:06
#top strftime¶
strftime(format, timestamp)
formatuje timestamp według wskazówek zawartych w zmiennej format. timestamp powinien być taki sam, jak ten, zwracany przez systime(). Jeśli brakuje parametru timestamp, używany jest bieżący czas dnia. Jeżeli pominięto format, to używany jest domyślny format równoważny formatowi wyników z date(1). Zobacz specyfikację funkcji strftime () w ANSI C, aby zobaczyć jakie konwersje formatów są na pewno dostępne. Razem z gawk dostarczana jest wersja public domain strftime(3) oraz odpowiednia strona podręcznika man; jeśli ta wersja została użyta do zbudowania gawk, to wszystkie konwersje opisane na tej stronie będą dostępne dla gawk.
Przykład: sposób wywołania:
echo | awk '{ts=mktime("2001 02 03 04 05 06");print("ts="ts);print(strftime("%Y/%m/%d %H:%M:%S",ts));}'
ts=981169506 2001/02/03 04:05:06
#top systime¶
systime()
zwraca bieżący czas dnia w liczbach sekund od początku Epoki (czyli od północy UTC, 1 stycznia 1970 na systemach POSIX-owych).
Przykład: sposób wywołania:
echo | awk '{nowtime=systime();print("nowtime="nowtime);print(strftime("%Y/%m/%d %H:%M:%S",nowtime));}'
nowtime=1374439406 2013/07/21 22:43:26
#top Funkcje operujące na bitach¶
Począwszy od wersji 3.1 gawk, dostępne są poniższe funkcje operujące na bitach. Działają przez konwersję wartości zmiennoprzecinkowych podwójnej precyzji na całkowite unsigned long, wykonanie operacji, a następnie konwersję wyniku z powrotem na zmiennoprzecinkowy. Te funkcje to:
#top and¶
and(v1, v2)
Zwraca bitową koniunkcję AND wartości podanych przez v1 i v2.
#top compl¶
compl(val)
Zwraca bitowe uzupełnienie val.
#top lshift¶
lshift(val, ile)
Zwraca wartość val, przesuniętą w lewo o ile bitów.
#top or¶
or(v1, v2)
Zwraca bitową alternatywę OR wartości podanych przez v1 i v2.
#top rshift¶
rshift(val, ile)
Zwraca wartość val, przesuniętą w prawo o ile bitów.
#top xor¶
xor(v1, v2)
Zwraca bitową alternatywę wykluczającą XOR wartości podanych przez v1 i v2.
#top Funkcje internacjonalizacji¶
Począwszy od wersji 3.1 gawk, można używać wewnątrz programów AWK funkcji do tłumaczenia łańcuchów podczas wykonania programu. Szczegóły opisano w GAWK: Efektywne programowanie w AWK.
#top bindtextdomain¶
bindtextdomain(katalog [, domena])
Określa katalog, w którym gawk szuka plików .mo, w przypadku gdy nie będą lub nie mogą być umieszczone w "standardowych" miejscach (np., podczas testów). Zwraca katalog, z którym jest "związana" domena. Domyślną domeną jest wartość
TEXTDOMAIN
. Jeśli katalog jest łańcuchem pustym (""), to bindtextdomain()
zwraca bieżące wiązanie dla zadanej domeny.#top dcgettext¶
dcgettext(łańcuch [, domena [, kategoria]])
Zwraca tłumaczenie łańcucha w domenie tekstowej domena dla kategorii locale kategoria. Domyślną domeną jest bieżąca wartość
TEXTDOMAIN
. Domyślną wartością kategorii jest "LC_MESSAGES"
. Jeśli podaje się wartość kategorii, to musi to być łańcuch równy jednej ze znanych kategorii locale opisanych w GAWK: Efektywne programowanie w AWK. Trzeba również podać domenę tekstową. Użyj TEXTDOMAIN
, jeśli chcesz korzystać z bieżącej domeny.#top FUNKCJE UŻYTKOWNIKA¶
Funkcje w AWK są definiowane następująco:
function nazwa(lista parametrów) { instrukcje }
Funkcje są wykonywane po wywołaniu ich z wyrażeń występujących we wzorcach lub akcjach.
Do tworzenia instancji parametrów formalnych, zadeklarowanych w funkcji używane są parametry faktyczne użyte w wywołaniu funkcji. Tablice są przekazywane przez wskazanie, inne zmienne przez wartość.
Ponieważ funkcje pierwotnie nie były częścią języka AWK, obsługa zmiennych lokalnych jest trochę niezdarna: Są one deklarowana jako dodatkowe parametry w liście parametrów. Konwencja polega na separowaniu zmiennych lokalnych od parametrów dodatkowymi spacjami w liście parametrów. Na przykład:
function f(p, q, a, b) { # a i b są lokalne ..... }
/abc/ { ... ; f(1, 2) ; ... }
Lewy nawias w wywołaniu funkcji musi występować bezpośrednio za nazwą funkcji, bez wtrąconej białej spacji. Ma to na celu zapobieżenie niejednoznaczności składni z operatorem konkatenacji (łączenia). Ograniczenie to nie odnosi się do funkcji wbudowanych, które są opisane powyżej.
Funkcje mogą wołać siebie nawzajem i mogą być rekurencyjne. Parametry funkcji używane jako zmienne lokalne są podczas wywołania funkcji inicjalizowane na łańcuch pusty i liczbę zero. Chcąc, by funkcja zwracała wartość należy posłużyć się składnią: return wyraż. Wartość zwracana przez funkcję jest niezdefiniowana jeśli nie podano wartości zwracanej lub funkcja kończy pracę bez jawnej instrukcji powrotu.
#top Przykładowa funkcja użytkownika¶
Ze względu przeznaczenia awk do przetwarzania tekstu, awk świetnie nadaje się do przetwarzania informacji zapisywanych w różnego rodzaju logach tekstowych.
Logi systemowe zawierają najczęściej datę w formacie:
dd/mmm/YYYY HH:MM:SS
, na przykład: 01/Jan/2000 00:00:00
.Niestety taka nie nadaje się do sortowania (wprawdzie sortować logów nie ma potrzeby, najczęściej zapisywane informacje są już posortowane chronologicznie),
jednakże w dalszym ciągu taka data jest mało czytelna, korzystając z awk można dosyć łatwo taką datę zamienić na format:
YYYY/mm/dd HH:MM:SS
,poniższy przykład należy zapisać do pliku
syslogdateparse.awk
:#!/bin/awk -f BEGIN { MMNAME["Jan"]="01"; MMNAME["Feb"]="02"; MMNAME["Mar"]="03"; MMNAME["Apr"]="04"; MMNAME["May"]="05"; MMNAME["Jun"]="06"; MMNAME["Jul"]="07"; MMNAME["Aug"]="08"; MMNAME["Sep"]="09"; MMNAME["Oct"]="10"; MMNAME["Nov"]="11"; MMNAME["Dec"]="12"; } function mailLogDateParse(strdate) { gsub(":", " ", strdate); #print("parseMailLogDate(): =="strdate"=="); split(strdate, ARRD, " "); YYYY=strftime("%Y"); MM=ARRD[1]; MM=MMNAME[MM]; if (length(MM)<2) MM="0"MM; DD=ARRD[2]; if (length(DD)<2) DD="0"DD; HH=ARRD[3]; II=ARRD[4]; SS=ARRD[5]; tmstamp=mktime(YYYY" "MM" "DD" "HH" "II" "SS); #print("parseMailLogDate(): tmstamp=|"tmstamp"| strtime|"YYYY" "MM" "DD" "HH" "II" "SS"|"); #strtime=strftime("%Y/%m/%d %H:%M:%S", tmstamp); if (length(YYYY)>0 && length(MM)>0 && length(DD)>0 && length(HH)>0 && length(II)>0 && length(SS)>0) { strtime=YYYY"/"MM"/"DD" "HH":"II":"SS; } else { strtime=strdate"-"YYYY"/"MM"/"DD" "HH":"II":"SS; } return strtime; } { hrdate=mailLogDateParse($1" "$2" "$3); print(hrdate" "substr($0,index($0,$4))); }
nadać atrybuty wykonywania dla pliku
syslogdateparse.awk
w następujący sposób:
chmod a+x syslogdateparse.awk
a następnie uruchomić w następujący sposób:
tail -f /var/log/messages | ./syslogdateparse.aw
w wyniku wywołania skryptu powinien pojawić sie na ekranie fragment logu z czytelniejszą datą:
2001/01/01 12:10:03 xnd last message repeated 9 times 2001/01/01 12:10:03 xnd snmpd[4710]: Connection from UDP: [10.5.5.5]:35024 2001/01/01 12:10:03 xnd snmpd[4710]: Received SNMP packet(s) from UDP: [10.5.5.5]:35024 2001/01/01 12:10:03 xnd snmpd[4710]: Connection from UDP: [10.5.5.5]:35024 2001/01/01 12:10:03 xnd last message repeated 9 times 2001/01/01 12:10:03 xnd snmpd[4710]: Connection from UDP: [10.5.5.5]:58866 2001/01/01 12:10:03 xnd snmpd[4710]: Received SNMP packet(s) from UDP: [10.5.5.5]:58866 2001/01/01 12:10:03 xnd snmpd[4710]: Connection from UDP: [10.5.5.5]:58866
awk - pattern scanning and processing language
awk vertical text
psaf | tail -100 | awk 'BEGIN{maxlines=0;} {LINES[NR]=$0;maxlines=NR;} END{ for(c=0;c<150;c++){print(LINES[c]);} for(r=0;r<125;r++){for(c=0;c<150;c++){ printf(substr(LINES[c],r,1)); }print("");} }'
awk=awk+grep
ps -Ao pid,user,args | grep 'user' | awk '{print($1" "$2);}' ps -Ao pid,user,args | awk '/user/{print($1" "$2);}'
sed=sed+grep
ps -Ao pid,user,args | grep 'user' | sed -n 's,^[\t ]*\([^\t ]*[\t ]*[^\t ]*\)[\t ].*$,\1,p' ps -Ao pid,user,args | sed -n 's,^[\t ]*\([^\t ]*[\t ]*user*\)[\t ].*$,\1,p'
Built-in Variables
ARGC
The number of command line arguments (does not include options to gawk, or the program source).ARGIND
The index in ARGV of the current file being processed.ARGV
Array of command line arguments. The array is indexed from 0 to ARGC - 1. Dynamically changing the contents of ARGV can control the files used for data.Zawartość pliku
awkscript.awk
:#!/bin/awk { print("ARGC=" ARGC); print("ARGIND=" ARGIND); for (i=0;i<ARGC;i++) print("ARGV["i"]="ARGV[i]); }Sposób wywołania:
awk -f awkscript.awk /etc/passwd
ARGC=2 ARGIND=1 ARGV[0]=awk ARGV[1]=/etc/passwd
Sposób wywołania
echo | awk -f awkscript.awk - /etc/passwd
ARGC=3 ARGIND=2 ARGV[0]=awk ARGV[1]=- ARGV[2]=/etc/passwd
Sposób wywołania:
echo | awk -f awkscript.awk - /dev/null
ARGC=3 ARGIND=1 ARGV[0]=awk ARGV[1]=- ARGV[2]=/dev/null
NR
- The total number of input records seen so far.FNR
- The input record number in the current input file.FS
- The input field separator, a space by default. See Fields, above.NF
- The number of fields in the current input record.awk 'BEGIN { ... }'
- code running before beggining (i.e. initialization data)awk '{ ... }'
- code running in every line at STDINawk 'END { ... }'
- code running after end (i.e. print result or statistic)define field separator
awk 'BEGIN{FS="user"} { print($1"|"$2"|"$3); }' awk -F 'user' '{ print($1"|"$2"|"$3); }'
grep STDIN in awk
awk '/user/ { print($0); }' awk '{ if(index($0,"user")>=0){print($0);} }' grep 'user' | awk '{ print($0); }'
-v var=val --assign=var=val
echo | awk -v aaa=123 -v bbb=456 '{ print("aaa="aaa); print("bbb="bbb); }'
{ if (NR%4) { p3=p2;p2=p1;p1=$0 } else { print p3","p2","p1","$0 } } NR=1, NR%4=>1 | NR=2, NR%4=>2 | NR=3, NR%4=>3 | NR=4, NR%4=>0 NR=5, NR%4=>1 | NR=6, NR%4=>2 | NR=7, NR%4=>3 | NR=8, NR%4=>0co czwarta iteracja wykonywana jest instrukcja else
gdyż co 4 iterację if nie jest prawdziwy
parse a csv file that contains commans in the fields with awk
cat testfile.csv | awk -F'","|",|,"|^"|"$' '{sub("^\"","")} {print("$1=|"$1"| $2=|"$2"| $3=|"$3"|");}' echo '"$141,818.88","$52,831,578.53","$52,788,069.53"' | awk -F'","|^"|"$' '{sub("^\"","")} {print("$1=|"$1"| $2=|"$2"| $3=|"$3"|");}'
$1=|$141,818.88| $2=|$52,831,578.53| $3=|$52,788,069.53|
Zmodyfikowany ostatnio: 2015/10/22 01:04:35 (8 lat temu),
textsize: 49,4 kB,
htmlsize: 77,9 kB
Zapraszam do komentowania, zgłaszania sugestii, propozycji, własnych przykładów, ...
Dodaj komentarzKomentarze użytkowników