awk 명령에 대한 자세한 설명
간단한 사용법:
awk: 파일의 각 줄에 대해 작업을 수행합니다.
awk -F: '{print $1,$4}' : ':'을 사용하여 이 줄을 분할하고 이 줄의 첫 번째와 네 번째 필드를 인쇄합니다.
상세 소개:
AWK 명령어 소개
awk 언어의 가장 기본적인 기능은 파일이나 문자열에 지정된 규칙을 기반으로 정보를 찾아 추출합니다. awk가 정보를 추출한 후에만 다른 텍스트 작업을 수행할 수 있습니다. 완전한 awk 스크립트는 일반적으로 텍스트 파일의 정보 형식을 지정하는 데 사용됩니다. 1. awk 호출:
첫 번째 명령줄 방법:
awk [-Field-separator] 'commands' input- file(s)
여기에 있는 명령은 실제 awk 명령이고, [-F 도메인 구분 기호]는 선택 사항이며, awk는 기본적으로 공백을 사용하여 구분하므로 탐색하려는 경우 도메인 사이의 공백 이 옵션을 지정할 필요는 없지만 passwd와 같은 파일을 탐색하고 이 파일의 각 필드가 구분 기호로 콜론을 사용하는 경우 -F 옵션을 사용해야 합니다: awk -F : 'commands' input-file
둘째, 모든 awk 명령을 파일에 삽입하고 awk 프로그램을 실행 가능하게 만든 다음 awk 명령 해석기를 스크립트의 첫 번째 줄로 사용하여 다음을 호출할 수 있습니다.
세 번째로 모든 awk 명령을 별도의 파일에 삽입한 후 다음과 같이 호출합니다.
awk -f awk-script-file input-file
-f 옵션은 awk-script-file 파일에 awk 스크립트를 지정하고, input-file은 awk를 사용하여 검색한 파일 이름입니다
2. awk 스크립트 :
awk 스크립트는 구분 기호(-F 옵션)에 따라 다양한 동작과 모드로 구성됩니다. .읽은 내용은 해당 필드에 차례대로 배치됩니다. 파일 끝까지 읽은 것을 기록합니다
2.1 모드 및 동작
모든 awk 문은 모드와 동작으로 구성됩니다. awk에는 스크립트에 많은 문이 있을 수 있습니다. 모드 부분은 작업 명령문이 실행되고 이벤트가 트리거되는 시기를 결정합니다. 액션은 데이터에 대한 작업입니다. 패턴 부분이 생략되면 액션은 항상 실행 상태로 유지됩니다.
패턴은 조건문이나 복합문 또는 정규 표현식일 수 있습니다. 두 개의 특수 필드 BEGIN 및 END가 포함되어 있으며 BEGIN 문을 사용하여 카운트 및 인쇄 헤드를 설정합니다. BEGIN 문은 텍스트 탐색 작업 전에 사용되며 입력 파일을 기반으로 텍스트 탐색 작업이 실행됩니다. awk가 텍스트 탐색 작업을 완료한 후 총 텍스트 수를 인쇄하려면 작업을 {}
로 묶어야 합니다. 실제 작업은 중괄호 {} 안에 지정됩니다. 이는 작업 인쇄에 일반적으로 사용되지만 if 및 루프 문 및 루프 종료 등과 같은 더 긴 코드도 있습니다. 수행할 작업을 지정하지 않으면 awk는 기본적으로 탐색된 모든 레코드를 인쇄합니다
2.2. 도메인 및 레코드:
awk가 실행되면 검색 태그는 $1, $2...$n입니다. 첫 번째와 세 번째 필드를 참조하려면 $1과 $3을 사용하세요. 쉼표는 필드를 구분하는 데 사용되며 $0은 모든 필드를 사용한다는 의미입니다. 예:
awk '{print $0}' temp.txt > sav.txt
는 모든 필드를 인쇄하고 결과를 리디렉션하는 것을 의미합니다. sav.txt로 이동
awk '{print $0}' temp.txt|tee sav.txt
위의 예와 유사합니다. 하지만 화면에는 다르게 표시됩니다
awk '{print $1,$4}' temp.txt
첫 번째와 도메인 4
awk 'BEGIN {print "NAME GRADEn----"} {print $1"t"$4}' temp.txt
는 메시지 헤더를 입력한다는 의미입니다. 즉, 입력 내용의 첫 번째 줄 앞에 "NAME GRADEn-------------"를 추가하고 탭
awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 헤더와 트레일러를 동시에 인쇄 2.3. 조건 연산자: =, ~는 정규식과 일치합니다. ,!~ 정규 표현식 과 일치하지 않습니다. 일치: awk '{if ($4~/ASIMA/) print $0}' temp는 네 번째 필드에 ASIMA가 포함되어 있으면 전체를 인쇄함을 의미합니다. line 완전 일치: awk '$3=="48" {print $0}' temp 세 번째 필드가 "48"인 레코드만 인쇄 불일치: awk '$0 !~ /ASIMA/' temp ASIMA를 포함하지 않는 전체 레코드를 인쇄합니다. 같지 않음: awk '$1 != "asima"' 온도미만: awk '{if ($1
케이스 설정: awk '/[Gg]reen/' temp Green 또는 green
을 포함하는 전체 레코드를 인쇄합니다. 모든 문자: awk '$1 ~/^...a/' temp 첫 번째 필드의 네 번째 문자를 인쇄합니다. '^' 기호는 줄의 시작을 나타내고 '.'은 모든 문자를 나타냅니다.
또는 관계형 일치: awk '$0~/(abc)|(efg)/' temp 사용 | 언제, 명령문을 괄호로 묶어야 하는지
AND 관계: awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
OR: awk '{if ($1=="a" || $1=="b") print $0}' 임시
2.4 . awk 내장 변수:
예: awk 'END {print NR}' temp 마지막에 읽은 레코드 수를 인쇄합니다.
awk '{print NF, NR, $0} END {print FILENAME}' temp
awk '{if (NR>0 && $4~/Brown/) print $0}' temp 최소한 하나의 레코드가 존재하고 Brown을 포함합니다
NF의 또 다른 사용법: echo $PWD | awk -F/ '{print $NF}' 현재 디렉토리 이름 표시
2.5. awk 연산자:
awk에서 연산자를 사용하면 기본 표현식을 숫자 유형, 문자열 유형, 변수 유형, 필드로 나눌 수 있습니다. 및 배열 요소
는 입력 필드를 변수 이름으로 설정합니다.
awk '{name=$1;six=$3; =="man ") 인쇄 이름 "은 " six}' temp
도메인 값 비교 작업:
awk 'BEGIN {BASE= "27"} {if ($4
숫자 필드의 값 수정: (원래 입력 파일은 변경되지 않음)
awk '{if ($1=="asima") $6=$6-1;print $1, $6, $7}' temp
텍스트 수정 필드:
awk '{if ($1=="asima) ($1=="desc");print $1}' 임시
수정 기록만 표시:( 필요한 것만 표시합니다. 이전 명령과 다름, 참고 {})
awk '{if ($1=="asima) {$1== "desc";print$1}} ' temp
새 출력 필드 만들기:
awk '{$4=$3-$2; $4}' temp
통계 열 값:
awk '(tot+=$3);END {print tot}' temp는 다음을 표시합니다. 각 열의 내용
awk '{(tot+=$3)};END {print tot}' temp 최종 결과만 표시
파일 길이를 추가하세요:
ls -l|awk '/^[^d]/ {print $9"t"$5} {tot+=$5} END{print "totKB:" tot}'
파일 이름만 나열:
ls -l|awk '{print $9}' 일반적으로 파일 이름은 9번째입니다. domain
2.6. awk 내장 문자열 함수:
gsub(r, s) $0 전체에서 r을 s로 바꿉니다
awk 'gsub(/name/,"xingming") {print $0}' temp
gsub(r, s, t) r 교체 t 전체에 s 포함
index(s, t) s에서 문자열 t의 첫 번째 위치를 반환합니다.
awk 'BEGIN {print index("Sunny", "ny ")}' temp는 4를 반환합니다
length(s) s의 길이를 반환합니다
match( s, r) s에 일치하는 r 문자열이 포함되어 있는지 테스트합니다
awk '$1=="J.Lulu" {print match($1, "u")}' temp Return 4
split(s, a, fs) s를 fs의 시퀀스 a로 나눕니다
awk 'BEGIN {print Split("12#345# 6789",myarray,"# ")"'
3을 반환하고 while myarray[1]="12", myarray[2]="345", myarray[3]="6789"
sprint(fmt, exp ) fmt 형식의 exp 일치 문자열을 반환합니다.)
substr(s, p) 문자열 s에서 p로 시작하는 접미사 부분을 반환합니다.
substr(s, p , n) 문자열 s에서 p로 시작하고 길이가 n인 접미사 부분을 반환합니다.
2.7 printf 함수 사용:
문자 변환 : echo "65" |awk '{printf "%cn",$0}' 출력 A
awk 'BEGIN {printf "%fn",999}' 출력 999.000000
형식화된 출력: awk '{printf "%-15s %sn", $1, $3}' temp는 첫 번째 필드를 모두 왼쪽 정렬하여 표시합니다.
2.8. 기타 awk 사용법:
awk 명령 줄에 값 전달:
awk '{if ($5 who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME 환경 변수 사용 awk 스크립트 명령: 시작 부분에 !/bin/awk -f를 사용하세요. -포함된 스크립트는 실행되지 않습니다. 예: !/bin/awk -f # 모든 주석 줄은 해시로 시작해야 합니다. '#' # 이름: Student_tot.awk # 호출: Student_tot.awk grade.txt #동아리 학생 포인트의 총합과 평균을 인쇄합니다 # 헤더를 먼저 인쇄합니다 BEGIN { print "학생 일자 회원번호 학년 연령 포인트 최대" print "이름 가입 포인트 적립 가능" " 인쇄"================================== ============= ==========" } # 획득한 점수를 더해봅시다 (tot+=$6); # 처리가 완료되었습니다. 이제 총점과 평균점을 출력해 보겠습니다 END { 인쇄 "동아리 학생 총점:" tot "평균 동아리 학생 포인트:" tot/N } 2.9.9. > 문 1 문 2 형식에서 "문 1"은 여러 문이 될 수 있습니다. Unix의 awk 판단과 읽기를 용이하게 하려면 {}로 여러 문을 묶는 것이 좋습니다. Unix awk 분기 구조는 중첩을 허용하며 해당 형식은 다음과 같습니다. { 명령문 2} {문 3} [chengmo@localhost nginx]# awk 'BEGIN{ } test=100; while(i{ total+=i; for(k in ENVIRON) print k"="ENVIRON[k]; }' LANG=zh_CN.GB2312 설명: ENVIRON은 awk 상수이자 하위 일반적인 배열입니다. 형식 2: for(변수; 조건; 표현식) {statement} 예: [chengmo@ localhost nginx]# awk 'BEGIN{ 5050 3.do 루프 형식: do {statement}while( 조건 ) 예: [chengmo@localhost nginx]# awk 'BEGIN{ 이상 구문에서 볼 수 있듯이 awk 흐름 제어 문입니다. C 언어와 동일합니다. 이러한 명령문을 사용하면 실제로 많은 쉘 프로그램을 awk로 전달할 수 있으며 성능이 매우 빠릅니다. awk 명령어 관련 더 자세한 글은 PHP 중국어 홈페이지를 참고해주세요!
if(expression)
test=100;
if(test>90)
{
else if(test>60)
{
"좋음" 인쇄;
}
else
{
" 인쇄 no pass";
}
}'
very good
i++;
}
print total;
}'
5050
2.for 루프
for 루프에는 두 가지 형식이 있습니다.
AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
. . . . . .
total=0;
for(i=0;i{
total+=i;
}
전체 인쇄 ;
}'
total=0;
i=0;
do
{
total+=i;
i++;
}while(iprint total;
}'
5050