awk 사용법
'정규 표현식' 을 사용하면 문자열을 간단하게 필터할 수 있습니다.
Unix/Linux
awk
도 이러한 작업을 수행할 수 있는 명령입니다.awk
는 프로그래밍 언어로서 우리에게 다양한 조작을 제공할 수 있다.awk에는 다음과 같은 문법이 있습니다.(file을 받은 경우에만)
awk /pattern/ { actions } filenames
pattern은 각 줄의 패턴이 일치하고 action은 각 줄에 대해 어떤 처리(표시, 변수의 덧셈 등)를 적용하는가이다.우선
파일 내용 표시
hoge.txt
.hello
world
hello2
helle
다음 명령awk
을 사용하여 파일의 내용을 표시할 수 있습니다.awk '{print}' hoge.txt
파일에서 문자열이 포함된 행 추출
예를 들어
hoge.txt
에서 포함hello
을 추출한 줄은 다음과 같다.awk '/hello/{print}' hoge.txt
결과hello
hello2
/hello/
의 섹션에서는 추출할 문자열 모드를 지정하고 /
에서 문자 패턴을 둘러싸서 지정합니다.그러므로
awk '{print}' hoge.txt
도 다음과 같이 설명할 수 있다.//
는 추출할 문자열 모드가 없음을 나타냅니다.awk '//{print}' hoge.txt
와일드카드
*
어댑터로 작용한다.이 경우 h는 0회 이상을 포함하고 2회를 포함하는 줄을 표시합니다.awk '/h*2/{print}' hoge.txt
결과hello2
.
도 유사하게 사용할 수 있다.이 경우, 어느 순간 h로 시작하여, 중간에 l을 포함하는 줄을 표시합니다.awk '/h.l/' hoge.txt
결과hello
hello2
helle
행의 경우hogefugahogefuga
주의 사항awk '/h*a/' hoge.txt
를 실행할 때 가장 긴 문자열 모드hogefuga
를 되돌려줍니다 /h*a
.문자가 포함된 여러 줄 추출
hogefugahogefuga
또는 l
를 포함하는 줄을 추출하고 싶은 경우.awk '/[lw]/' hoge.txt
결과hello
world
hello2
helle
또한 w
또는 l
이후w
에 도착한 줄을 추출한 경우 다음과 같다.awk '/[lo]2/' hoge.txt
결과hello2
범위를 지정하여 행 추출하기
첫 번째 문자열 일치
2
부터 시작하는 줄입니다.awk '/^h/' hoge.txt
결과hello
hello2
helle
끝 문자열 일치
h
로 끝나는 줄을 추출합니다.awk '/d$/' hoge.txt
// awk '/ld$/' hoge.txt
결과world
파일에서 추출
테스트 파일
No Name Math Eng
1 Alice 90 80
2 Bob 60 100
3 Carl 80 40
전체 열에 공백 없음
awk '//{print $1 $2 $3}' score.csv
결과NoNameMath
1Alice90
2Bob60
3Carl80
전체 열 디스플레이 공간
awk '//{print $1, $2, $3}' score.csv
결과No Name Math
1 Alice 90
2 Bob 60
3 Carl 80
printf에서format
awk '//{printf "%d-%s\n",$1, $2}' score.csv
결과0-Name
1-Alice
2-Bob
3-Carl
비교 연산자
d
의 구상은 다음과 같다.No Item_Name Quantity Price
1 Mango 45 $3.45
2 Apple 25 $2.45 **
3 Pineapple 5 $4.45 **
4 Tomato 25 $3.45 **
5 Onion 15 $1.45 **
6 Banana 30 $3.45 **
비교 연산자를 사용하는syntax는 다음과 같다.expression { actions; }
expression의 부분에서 기대하는 공식을 묘사한다.Quantity 는 10 이하의 줄만 표시합니다.
awk '$3 < 10 {print $0}'
결과3 Pineapple 5 $4.45
Quantity 는 20 개 이상의 행에 many 를 추가합니다.
awk '$3 >= 20 {printf "%s\t%s\n", $0, "many";} $3 < 20 {print $0; }' food.csv
결과No Item_Name Quantity Price many
1 Mango 45 $3.45 many
2 Apple 25 $2.45 many
3 Pineapple 5 $4.45
4 Tomato 25 $3.45 many
5 Onion 15 $1.45
6 Banana 30 $3.45 many
Item 이름이 A로 시작하는 행 추출
awk '($2 ~ /^A/) {printf "%s\n", $0}' food.csv
결과2 Apple 25 $2.45
Item 이름은 A로 시작하고 Quantity는 20개 이상의 행을 추출합니다.
awk '($2 ~ /^A/) && ($3 >=20) {printf "%s\n", $0}' food.csv
결과2 Apple 25 $2.45
30가지 상황을 시험해 보세요.awk '($2 ~ /^A/) && ($3 >=30) {printf "%s\n", $0}' food.csv
결과 없음next 명령을 통해 실행 효율을 높이다
Quantity 가 20개 이상의 행에 many 를 추가하는 위치에 설명된 명령에 문제가 있습니다.
awk '$3 >= 20 {printf "%s\t%s\n", $0, "many";} $3 < 20 {print $0; }' food.csv
3열의 값이 20 이상으로 확인된 후에도 이후식food.csv
을 실행한다.따라서
$3 < 20 {print $0; }
명령을 사용합니다.awk '$3 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $3 > 20 { print $0 ;}' food.csv
Begin과 End.
키워드
next
와 BEGIN
를 사용하면 awk 명령을 실행하는 것과 일치하는 동작을 수행할 수 있습니다.BEGIN 모드에서는 입력 줄을 읽기 전에 BEGIN이 지정한 동작을 한 번만 수행합니다.
END 모드에서는 Awk가 실제로 종료되기 전에 END에서 지정한 작업을 수행합니다.
다음 명령은 사용 예입니다.
END
의 Quantity 행에서 20이 넘는 행 수를 계산합니다.awk 'BEGIN { printf "Count: " } $3 >= 20 {n+=1} END {print n}' food.csv
결과Count: 5
END 제외awk '$3 >= 20 {n+=1} {print n}' food.csv
결과1
2
3
3
4
4
5
기타
awk 'BEGIN {print "hello world"}'
도 계산할 수 있다.awk 'BEGIN {print 1*2*100, 5/2}' // 200 , 2.5
삽입식 변수
food.csv
에 포함된 변수가 있습니다.awk '{print NF}' food.csv
결과: 각 행의 열 수를 표시합니다.4
4
4
4
4
4
4
참고 자료
Reference
이 문제에 관하여(awk 사용법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/peg/articles/3d7feb0b38068f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)