awk 용법 소결
3089 단어 awk 용법 소결
기본 문법
자신의 이해 로 볼 때 awk 는 한 줄 한 줄 씩 열 을 조작 하 는 것 이다.다시 말 하면 awk 는 매번 한 줄 을 처리 하고 이 줄 의 모든 '도 메 인' 을 처리 한 후에 다음 줄 의 도 메 인 을 처리 합 니 다.도 메 인 구분 방식 은 스스로 지정 할 수 있 습 니 다. 기본 값 은 빈 칸 과 탭 문자 로 나 눌 수 있 습 니 다.awk 문 구 는 한 쌍 의 작은 따옴표 안에 있어 야 합 니 다. 할 일 은 한 쌍 의 괄호 안에 있어 야 합 니 다. 문법 은 c 언어 와 매우 유사 하고 융합 되 어 관통 하면 됩 니 다. 예 를 들 어:
awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
이 문 구 는 ':' 를 구분자 로 하여/etc/passwd 파일 의 첫 번 째 열 을 출력 한 다 는 뜻 입 니 다.왜 맨 앞 에 BEGIN 이라는 키 워드 를 넣 어야 합 니까?awk 는 모든 작업 을 하기 전에 한 줄 의 텍스트 를 읽 기 때문에 첫 줄 의 구분자 가 ":"가 아 닙 니 다.그래서 BEGIN 의 목적 은 awk 가 첫 줄 을 읽 기 전에 구분자 설정 을 하 는 것 입 니 다.BEGIN 키워드 외 에 END 라 는 키워드 도 있 습 니 다. 예 를 들 어:
awk 'BEGIN {FS=":";print "******"} {print $1} END {print "******"}' /etc/passwd
":"를 구분자 로 하고 맨 끝 과 맨 끝 에 "* * * *"를 출력 합 니 다.
그 밖 에 괄호 를 서로 다른 위치 에 넣 으 면 프로그램의 의미 에 큰 영향 을 미친다. 예 를 들 어 다음 과 같은 두 단계 의 절차 가 있다.
awk 'BEGIN {FS=":"} {if ($1=="root") $1="rot";print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {if ($1=="root") {$1="rot";print $1}}' /etc/passwd
첫 번 째 프로그램 은/etc/passwd 파일 의 첫 번 째 열 에 있 는 모든 내용 을 출력 하고 'root' 를 'rot' 로 출력 합 니 다. 두 번 째 프로그램 은 'root' 를 'rot' 로 출력 할 뿐 다른 프로그램 은 출력 하지 않 습 니 다.
정규 표현 식
awk 에서 정규 표현 식 을 사용 하려 면//괄호 를 사용 해 야 합 니 다. 예 를 들 어 "passwd"라 는 문자열 과 일치 하면 문법 은/passwd/입 니 다.예 를 들 어/etc/passwd 파일 의 첫 번 째 열 에 '루트' 키 가 일치 하고 일치 하면 전체 줄 을 출력 하 며 일치 하지 않 으 면 출력 하지 않 습 니 다.
awk 'BEGIN {FS=":"} {if ($1~/root/) print $0}' /etc/passwd
3. 내 장 된 변수 와 문자열 함수
awk 에서 가장 자주 사용 하 는 세 개의 내장 변 수 는 FS, NF, NR 이 고 세 가지 의 미 는 구분자, 현재 처리 하 는 도 메 인 (숫자), 현재 줄 (숫자) 이다.
awk 에 내 장 된 문자열 함 수 는 주로 gsub (r, s), gsub (r, s, t), index (s, t), length (s), match (s, r), split (s, a, fs), sub (r, s), substr (s, p), substr (s, p, n) 가 있 습 니 다.
1、gsub(r,s)
$0 에 s 로 r 바 꾸 기
2、gsub(r,s,t)
t 에 s 로 r 바 꾸 기
3、index(s,t)
s 에 있 는 t 의 위 치 를 찾 습 니 다.
4、length(s)
말 그대로
5、match(s,r)
index 와 유사 하지만, 이 때 r 는 정규 표현 식 을 사용 할 수 있 습 니 다.
6、split(s,a,fs)
s 를 구분자 fs 로 구분 하여 배열 a 에 넣 습 니 다. 예 를 들 어:
awk 'BEGIN {print split("1*2*3",a,"*")}'
왜 "BEGIN"을 추가 해 야 합 니까? 제 가 이해 하기 로 awk 는 명령 어 를 실행 하기 전에 뒤에 있 는 파일 의 한 줄 을 읽 고 입력 합 니 다. 그러나 뒤에 파일 이 연결 되 지 않 으 면 awk 가 계속 걸 립 니 다. 그래서 BEGIN 의 목적 은 awk 가 파일 내용 을 읽 기 전에 명령 을 실행 하고 걸 리 지 않도록 하 는 것 입 니 다.
7、sub(r,s)
s 로 r 를 교체 합 니 다. gs 와 달리 sub 는 한 번 만 교체 합 니 다.
8、substr(s,p)
출력 문자열 s 의 p 번 째 문자 와 그 다음 문자, 예 를 들 어:
awk 'BEGIN {FS=":"} {print substr($1,1,3)}' /etc/passwd
출력/etc/passwd 의 첫 번 째 필드 에 있 는 세 글자 의 데이터 입 니 다.