AWK

AWK는 GNU/Linux의 텍스트 처리 유틸리티입니다.
그것은 매우 강력하고 간단한 프로그래밍 언어를 사용합니다.
몇 줄의 코드로 복잡한 텍스트 처리 작업을 해결할 수 있습니다.

AWK로 수행할 수 있는 작업의 예:



텍스트 처리,
형식화된 텍스트 보고서 생성,
산술 연산 수행,
문자열 작업 수행,
DB의 로그 파일을 포함한 로그 파일 파싱,
데이터를 DB에 채우는 쿼리 구성
그리고 더 많은.

AWK는 읽기, 실행 및 반복이라는 간단한 워크플로를 따릅니다.


읽다



AWK는 입력 스트림(파일, 파이프 또는 stdin)에서 한 줄을 읽고 메모리에 저장합니다.

실행하다



모든 AWK 명령은 입력에 순차적으로 적용됩니다. 기본적으로 AWK는 명령을 실행합니다.
모든 라인에서. 패턴을 제공하여 이를 제한할 수 있습니다.

반복하다



이 과정은 파일이 끝날 때까지 반복됩니다.

BEGIN 블록



BEGIN 블록의 구문은 다음과 같습니다.
통사론
BEGIN {awk 명령}
BEGIN 블록은 프로그램 시작 시 실행됩니다. 한 번만 실행됩니다. 좋은 곳이야
변수를 초기화합니다. BEGIN은 AWK 키워드이므로 대문자여야 합니다. 제발
이 블록은 선택 사항입니다.

바디 블록



본문 블록의 구문은 다음과 같습니다.
통사론
/패턴/{awk 명령}
본문 블록은 모든 입력 라인에 AWK 명령을 적용합니다. 기본적으로 AWK는 다음을 실행합니다.
모든 줄의 명령. 패턴을 제공하여 이를 제한할 수 있습니다. 없음에 유의하십시오.
본문 블록의 키워드.

엔드 블록



END 블록의 구문은 다음과 같습니다.
통사론
END {awk 명령}
END 블록은 프로그램의 끝에서 실행됩니다. END는 AWK 키워드이므로 반드시
대문자여야 합니다. 이 블록은 선택 사항입니다.

dmi@dmi-laptop:~/my_awk$ cat marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89



dmi@dmi-laptop:~/my_awk$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"}'
Sr No Name Sub Marks



dmi@dmi-laptop:~/my_awk$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt
Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89



dmi@dmi-laptop:~/my_awk$ awk '{print}' marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89



dmi@dmi-laptop:~/my_awk$ cat command.awk
{print}
dmi@dmi-laptop:~/my_awk$ awk -f command.awk marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ awk -v name=Linda 'BEGIN{printf "Name = %s\n", name}'
Name = Linda



dmi@dmi-laptop:~/my_awk$ cat marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$ awk '{print $3 "\t" $4}' marks.txt
Physics 80
Maths 90
Biology 87
English 85
History 89
dmi@dmi-laptop:~/my_awk$


다음 예에서는 양식 패턴 a를 검색합니다.
패턴 일치가 성공하면 본문 블록에서 명령을 실행합니다.

dmi@dmi-laptop:~/my_awk$ cat marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$ awk '/a/ {print $0}' marks.txt
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$


본문 블록이 없는 경우 레코드를 인쇄하는 기본 작업이 수행됩니다.

dmi@dmi-laptop:~/my_awk$ awk '/a/' marks.txt
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$


어떤 순서로든 열을 인쇄할 수 있습니다.

dmi@dmi-laptop:~/my_awk$ awk '/a/ {print $4 "\t" $3}' marks.txt
90 Maths
87 Biology
85 English
89 History
dmi@dmi-laptop:~/my_awk$


패턴 일치가 성공한 줄의 수를 세고 출력할 수 있습니다.

dmi@dmi-laptop:~/my_awk$ cat marks.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
dmi@dmi-laptop:~/my_awk$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt
Count = 4
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat my_example.txt
aaa bbb
cccccc dd
eee
fffff fff ffff
ggg hh hhh hhhh
kkk ll
dmi@dmi-laptop:~/my_awk$ awk 'length($0) > 3' my_example.txt
aaa bbb
cccccc dd
fffff fff ffff
ggg hh hhh hhhh
kkk ll
dmi@dmi-laptop:~/my_awk$ awk 'length($0) > 5' my_example.txt
aaa bbb
cccccc dd
fffff fff ffff
ggg hh hhh hhhh
kkk ll
dmi@dmi-laptop:~/my_awk$ awk 'length($0) > 8' my_example.txt
cccccc dd
fffff fff ffff
ggg hh hhh hhhh
dmi@dmi-laptop:~/my_awk$


$0 변수는 전체 줄을 저장합니다.
본문 블록이 없으면 기본 작업, 즉 인쇄 작업이 수행됩니다.

ARGC는 표준 AWK 변수입니다.
이는 명령줄에서 제공되는 인수의 수를 의미합니다.

dmi@dmi-laptop:~/my_awk$ awk 'BEGIN {print "Arguments =", ARGC}'


하나 둘 셋 넷
인수 = 5

ARGV는 표준 AWK 변수입니다.
명령줄 인수를 저장하는 배열입니다.
배열의 유효한 인덱스 범위는 0에서 ARGC-1까지입니다.

dmi@dmi-laptop:~/my_awk$ cat command.awk
BEGIN {
for (i = 0; i < ARGC - 1; ++i) {
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
}
dmi@dmi-laptop:~/my_awk$ awk -f command.awk one two three four five six seven eight
ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three
ARGV[4] = four
ARGV[5] = five
ARGV[6] = six
ARGV[7] = seven
dmi@dmi-laptop:~/my_awk$
dmi@dmi-laptop:~/my_awk$ awk 'BEGIN {
for (i = 0; i < ARGC - 1; ++i) {
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
} ' one two three four five six seven eight
ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three
ARGV[4] = four
ARGV[5] = five
ARGV[6] = six
ARGV[7] = seven
dmi@dmi-laptop:~/my_awk$


정규식 .
줄 끝 문자를 제외한 모든 단일 문자와 일치합니다.

dmi@dmi-laptop:~/my_awk$ echo -e "cat\nbat\nfun\nfin\nfan"
cat
bat
fun
fin
fan
echo -e ---- enables interpretation of backslash escapes
dmi@dmi-laptop:~/my_awk$ echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'
fun
fin
fan
dmi@dmi-laptop:~/my_awk$


정규식 ^ .
줄의 시작과 일치합니다.

dmi@dmi-laptop:~/my_awk$ echo -e "This\nThat\nThere\nTheir\nthese"
This
That
There
Their
these
dmi@dmi-laptop:~/my_awk$ echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'
There
Their
dmi@dmi-laptop:~/my_awk$


정규식 $.
줄의 끝과 일치합니다.

dmi@dmi-laptop:~/my_awk$ echo -e "knife\nknow\nfun\nfin\nfan\nnine"
knife
know
fun
fin
fan
nine
dmi@dmi-laptop:~/my_awk$ echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'
fun
fin
fan
dmi@dmi-laptop:~/my_awk$


정규식 [ ] 일치 문자 집합
여러 문자 중 하나만 일치시킬 때 사용합니다.

dmi@dmi-laptop:~/my_awk$ echo -e "Call\nTall\nBall"
Call
Tall
Ball
dmi@dmi-laptop:~/my_awk$ echo -e "Call\nTall\nBall" | awk '/[CT]all/'
Call
Tall
dmi@dmi-laptop:~/my_awk$


정규 표현식 [^ ] 전용 세트
단독 집합에서 ^는 대괄호 안의 문자 집합을 부정합니다.

dmi@dmi-laptop:~/my_awk$ echo -e "Call\nTall\nBall"
Call
Tall
Ball
dmi@dmi-laptop:~/my_awk$ echo -e "Call\nTall\nBall" | awk '/[^CT]all/'
Ball
dmi@dmi-laptop:~/my_awk$


파일에서 각 레코드의 길이를 찾는 방법은 무엇입니까?

dmi@dmi-laptop:~/my_awk$ cat my_example.txt
aaa bbb
cccccc dd
eee
fffff fff ffff
ggg hh hhh hhhh
kkk ll
dmi@dmi-laptop:~/my_awk$ awk '{print $0, ".....", length($0)}' my_example.txt
aaa bbb ..... 7
cccccc dd ..... 9
eee ..... 3
fffff fff ffff ..... 14
ggg hh hhh hhhh ..... 15
kkk ll ..... 6


구분자

dmi@dmi-laptop:~/my_awk$ cat some_file_with_commas.txt
aaa, bbb, ccc, dddd
eee
ff, gggg, hhhh, kk, llllll, mmmm, nnn
ooooo, pppp,qqq
rrr
sss
ttt, uuu,
vvv
dmi@dmi-laptop:~/my_awk$ awk -F, ' { print $2 } ' some_file_with_commas.txt
bbb
gggg
pppp
uuu
dmi@dmi-laptop:~/my_awk$
dmi@dmi-laptop:~/my_awk$ awk -F, ' length($2)>0 { print $2 } ' some_file_with_commas.txt
bbb
gggg
pppp
uuu
dmi@dmi-laptop:~/my_awk$


파일 목록에 AWK가 포함된 파일 크기의 합계

dmi@dmi-laptop:~/my_awk$ ls -l
total 16
-rw-rw-r-- 1 dmi dmi 99 Dec 11 08:45 command.awk
-rw-rw-r-- 1 dmi dmi 120 Dec 11 08:18 marks.txt
-rw-rw-r-- 1 dmi dmi 60 Dec 11 08:37 my_example.txt
-rw-rw-r-- 1 dmi dmi 100 Dec 11 09:11 some_file_with_commas.txt
dmi@dmi-laptop:~/my_awk$ ls -l | awk '{sum += $5} END {print sum}'
379
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ ls -l
total 16
-rw-rw-r-- 1 dmi dmi 99 Dec 11 08:45 command.awk
-rw-rw-r-- 1 dmi dmi 120 Dec 11 08:18 marks.txt
-rw-rw-r-- 1 dmi dmi 60 Dec 11 08:37 my_example.txt
-rw-rw-r-- 1 dmi dmi 100 Dec 11 09:11 some_file_with_commas.txt
dmi@dmi-laptop:~/my_awk$ ls -l | awk '$5 < 100 {print $0} '
total 16
-rw-rw-r-- 1 dmi dmi 99 Dec 11 08:45 command.awk
-rw-rw-r-- 1 dmi dmi 60 Dec 11 08:37 my_example.txt
dmi@dmi-laptop:~/my_awk$ ls -l | awk '$5 < 100 {print $9} '
command.awk
my_example.txt
dmi@dmi-laptop:~/my_awk$ ls -l | awk 'length($5)>0 && $5 < 100 {print $9} '
command.awk
my_example.txt
dmi@dmi-laptop:~/my_awk$


파일의 첫 줄 건너뛰기

dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data
Name, Address, Birthday, Mark
John, Green street, 2000-01-01, 100
Ann, Apple street, 1980-05-22, 99
Miki, Orange street, 1985-01-01, 97
dmi@dmi-laptop:~/my_awk$ awk '(NR>1)' some_data_to_populate.data
John, Green street, 2000-01-01, 100
Ann, Apple street, 1980-05-22, 99
Miki, Orange street, 1985-01-01, 97
dmi@dmi-laptop:~/my_awk$


awk의 NR 변수는 파일의 레코드 수를 나타냅니다.

dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data
Name, Address, Birthday, Mark
John, Green street, 2000-01-01, 100
Ann, Apple street, 1980-05-22, 99
Miki, Orange street, 1985-01-01, 97
dmi@dmi-laptop:~/my_awk$ awk -F, '(NR>1) { printf("%s", $2) } ' some_data_to_populate.data
Green street Apple street Orange streetdmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data
Name, Address, Birthday, Mark
John, Green street, 2000-01-01, 100
Ann, Apple street, 1980-05-22, 99
Miki, Orange street, 1985-01-01, 97
dmi@dmi-laptop:~/my_awk$ awk -F, '(NR>1) { printf("%s\n", $2) } ' some_data_to_populate.data
Green street
Apple street
Orange street


(NR>1) - 파일의 첫 번째 rec를 인쇄하지 않음

dmi@dmi-laptop:~/my_awk$ cat some_file_with_commas.txt
aaa, bbb, ccc, dddd
eee
ff, gggg, hhhh, kk, llllll, mmmm, nnn
ooooo, pppp,qqq
rrr
sss
ttt, uuu,
vvv
dmi@dmi-laptop:~/my_awk$ awk ' { printf("\x27") } ' some_file_with_commas.txt
''''''''dmi@dmi-laptop:~/



dmi@dmi-laptop:~/my_awk$ awk ' { printf("\x27\n") } ' some_file_with_commas.txt
'
'
'
'
'
'
'
'
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat some_file_with_commas.txt
aaa, bbb, ccc, dddd
eee
ff, gggg, hhhh, kk, llllll, mmmm, nnn
ooooo, pppp,qqq
rrr
sss
ttt, uuu,
vvv
dmi@dmi-laptop:~/my_awk$ awk -F, ' { printf("\x27%s\x27\n", $1) } ' some_file_with_commas.txt
'aaa'
'eee'
'ff'
'ooooo'
'rrr'
'sss'
'ttt'
'vvv'
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data | awk -F, ' NR>1 { printf("insert
into some_table values(trim(\x27%s\x27), trim(\x27%s\x27), trim(\x27%s\x27), %s);\n", $1, $2,
$3, $4); } '
insert into some_table values(trim('John'), trim(' Green street'), trim(' 2000-01-01'), 100);
insert into some_table values(trim('Ann'), trim(' Apple street'), trim(' 1980-05-22'), 99);
insert into some_table values(trim('Miki'), trim(' Orange street'), trim(' 1985-01-01'), 97);
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data | awk -F, ' NR>1 { printf("update
some_table set the_address=trim(\x27%s\x27), the_birthday=trim(\x27%s\x27), the_mark=%s
where the_name=\x27%s\x27;\n", $2, $3, $4, $1); } '
update some_table set the_address=trim(' Green street'), the_birthday=trim(' 2000-01-01'),
the_mark= 100 where the_name='John';
update some_table set the_address=trim(' Apple street'), the_birthday=trim(' 1980-05-22'),
the_mark= 99 where the_name='Ann';
update some_table set the_address=trim(' Orange street'), the_birthday=trim(' 1985-01-01'),
the_mark= 97 where the_name='Miki';
dmi@dmi-laptop:~/my_awk$



dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data
Name, Address, Birthday, Mark
John, Green street, 2000-01-01, 100
Ann, Apple street, 1980-05-22, 99
Miki, Orange street, 1985-01-01, 97
dmi@dmi-laptop:~/my_awk$
dmi@dmi-laptop:~/my_awk$ cat some_data_to_populate.data | awk -F, ' NR>1 { printf("insert
into some_table values(trim(\x27%s\x27), trim(\x27%s\x27), trim(\x27%s\x27), %s);\n", $1, $2,
$3, $4); } ' > RunMe.sql
dmi@dmi-laptop:~/my_awk$ cat RunMe.sql
insert into some_table values(trim('John'), trim(' Green street'), trim(' 2000-01-01'), 100);
insert into some_table values(trim('Ann'), trim(' Apple street'), trim(' 1980-05-22'), 99);
insert into some_table values(trim('Miki'), trim(' Orange street'), trim(' 1985-01-01'), 97);
dmi@dmi-laptop:~/my_awk$

좋은 웹페이지 즐겨찾기