CONTENT
  • CHANGES
Szukaj
counter

#top awk / gawk ((GNU)awk)


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 ...


#top DESCRIPTION

DESCRIPTION



#top OPTIONS

OPTIONS
Gawk accepts the following options, listed alphabetically.

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

-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.)

-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.

-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);}'
Rezultat:
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);}'
Rezultat:
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"
Rezultat:
1

Przykład: alternatywny sposób:
echo "1|2|3|4|5" | awk 'BEGIN{FS="|";}{print($1"
Rezultat:
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);}'
Rezultat:
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
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 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"]);}'
Rezultat:
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:

Rezultat:



#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);}'
Rezultat:
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);}'
Rezultat:
$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);}'
Rezultat:
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);}'
Rezultat:
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);}'
Rezultat:
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);}'
Rezultat:
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);}'
Rezultat:
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);}'
Rezultat:
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);}'
Rezultat:
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");}'
Rezultat:
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]);} }'
Rezultat:
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]);} }'
Rezultat:
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);}'
Rezultat:
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"));}'
Rezultat:
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));}'
Rezultat:
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)));}'
Rezultat:
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]);}}'
Rezultat:
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]);}}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
123

Przykład: sposób wywołania:
echo "123.123" | awk '{printf("%d\n",strtonum($0));}'
Rezultat:
123

Przykład: sposób wywołania:
echo "123.123" | awk '{printf("%f\n",strtonum($0));}'
Rezultat:
123,000000

Przykład: sposób wywołania:
echo "123ola123" | awk '{printf("%d\n",strtonum($0));}'
Rezultat:
123

Przykład: sposób wywołania:
echo "015" | awk '{printf("%d\n",strtonum($0));}'
Rezultat:
13

Przykład: sposób wywołania:
echo "0x0A" | awk '{printf("%d\n",strtonum($0));}'
Rezultat:
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);}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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));}'
Rezultat:
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
Rezultat: N (wc -l /etc/passwd) iterations:
ARGC=2
ARGIND=1
ARGV[0]=awk
ARGV[1]=/etc/passwd

Sposób wywołania
echo | awk -f awkscript.awk - /etc/passwd
Rezultat: N (wc -l /etc/passwd) iterations:
ARGC=3
ARGIND=2
ARGV[0]=awk
ARGV[1]=-
ARGV[2]=/etc/passwd

Sposób wywołania:
echo | awk -f awkscript.awk - /dev/null
Rezultat:
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 STDIN
awk '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=>0
co 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"|");}'
Rezultat:
$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