awk 상세 튜 토리 얼: 두 번 째 부분

2.3 표현 식 과 연산 자
awk 정규 표현 식 을 사용 할 수 있 습 니 다. 정규 표현 식 이 현재 줄 과 일치 하 는 지 에 따라 독립 코드 블록 을 선택 하 십시오.다음 예제 스 크 립 트 는 bill 에 문자 시퀀스 8613902700003 을 포함 하 는 줄 만 출력 합 니 다.
   
   
   
   
  1. awk '/8613902700003/ { print }' bill 

 물론 더 복잡 한 정규 표현 식 을 사용 할 수 있 습 니 다.
   
   
   
   
  1. /[0-9]*/ { print } 

정규 표현 식 메타 문 자 를 보 여 줍 니 다:
문자
묘사 하 다.
.
한 줄 을 제외 한 모든 단일 문 자 를 대체 할 수 있 습 니 다.
*
0 개 이상 의 앞 에 나타 나 는 문 자 를 대체 할 수 있 습 니 다.
[chars]
chars 의 모든 문 자 를 대체 할 수 있 습 니 다. chars 는 문자열 입 니 다.너 는 기호 로 문자 범 위 를 정의 할 수 있다.^ chars 의 첫 번 째 문자 라면 chars 에서 지정 하지 않 은 문자 와 일치 합 니 다.
^
한 줄 의 시작 과 일치 합 니 다.
$
일치 하 는 줄 의 끝
\
\ \ 뒤의 문 자 를 평소 대로 출력 합 니 다.
 
정규 표현 식 으로 줄 을 선택 하 는 것 외 에 도 불 표현 식 으로 줄 을 선택 할 수 있 습 니 다.사용 방법 은 불 표현 식 을 코드 블록 에 두 기 전에 앞의 불 표현 식 에 대해 값 을 구 할 때 만 awk 에서 코드 블록 을 실행 하 는 것 입 니 다.다음 예제 스 크 립 트 는 빌 의 네 번 째 필드 를 8613902700003 의 모든 줄 의 세 번 째, 네 번 째 필드 로 출력 합 니 다.현재 줄 의 네 번 째 필드 가 8613902700003 과 같 지 않 으 면 awk 는 현재 줄 에서 print 문 구 를 실행 하지 않 고 파일 을 계속 처리 합 니 다.
 
   
   
   
   
  1. $4 == "8613902700003" { print "OrgAddr: "$3"\tDestAddr: "$4 } 

 
코드 블록 앞의 불 표현 식 은 코드 블록 과 같은 줄 에 있어 야 합 니 다.
awk '=', ',', ',', ',', ',', ',', ',', ',', ',', ',', '와' 를 포함 한 완전한 비교 연산 자 집합 을 제공 합 니 다.".................................................................." 연산 자 는 각각 "일치" 와 "일치 하지 않 음" 을 표시 합 니 다. 연산 자 왼쪽 에 변 수 를 지정 하고 오른쪽 에 정규 표현 식 을 지정 합 니 다. 예 를 들 어:
 
   
   
   
   
  1. $4 ~ /8613902700003/ { print "OrgAddr: "$3"\tDestAddr: "$4 } 

 
awk 는 더 복잡 한 불 표현 식 을 만 들 기 위해 불 연산 자 "|" (논리 또는) 와 "&" (논리 와) 를 사용 할 수 있 습 니 다.
   
   
   
   
  1. ( $3 == "8613902700001" ) && ( $4 == "8613902700003" ) { print } 

 
awk 의 또 다른 장점 은 완전한 수학 연산 자 집합 이 있다 는 것 이다. 표준 적 인 더하기, 감소, 곱 하기, 나 누 기 를 제외 하고 awk 는 지수 연산 자 '^', 모 연산 자 '%' 와 C 언어 에서 빌 리 기 쉬 운 많은 할당 연산 자 를 사용 할 수 있다.
이러한 연산 자 는 전후 가감 (i + +, -- j), 가 / 감 / 승 / 제 할당 연산 자 (a + = 3, b * = 2, c / = 2.2, d - = 6.2) 를 포함한다. 뿐만 아니 라 사용 하기 쉬 운 모 / 지수 할당 연산 자 (a ^ = 2, b% = 4) 도 있다.
 
2.4 문자열 화 변수
awk 변수 '문자열 화' 는 모든 awk 변 수 를 내부 에 문자열 형식 으로 저장 하 는 것 을 말 합 니 다. 또한 변수 에 유효한 숫자 문자열 이 포함 되 어 있 으 면 수학 작업 을 수행 할 수 있 습 니 다. awk 는 문자열 을 숫자 로 변환 하 는 절 차 를 자동 으로 처리 합 니 다. 다음 예제 를 보십시오.
   
   
   
   
  1. BEGIN   { x="0" } 
  2. /^$/    { x=x+1 } 
  3. END     { print "I found " x " blank lines. :)" } 

이 예 는 파일 의 빈 줄 의 수 를 계산 하 는 기능 입 니 다. ^ $는 빈 줄 을 표시 합 니 다. 작은 실험 을 하면 특정한 변수 에 유효한 숫자 가 포함 되 어 있 지 않 으 면 awk 는 수학 표현 식 에 값 을 구 할 때 이 변 수 를 숫자 0 으로 처리 합 니 다.
3 제2 부분: 향상
3.1 다 중 처리
 
이 절 에서 세 가지 특별한 변 수 를 말씀 드 리 겠 습 니 다.
Awk 특수 변수
묘사 하 다.
RS
표시 레코드 구분자
OFS
출력 필드 구분 자 를 표시 하고 두 개의 단독 필드 에 정 의 된 문자열 을 삽입 합 니 다.
ORS
출력 기록 구분 자 를 표시 하고 두 개의 단독 기록 사이 에 정 의 된 문자열 을 삽입 합 니 다.
첫 번 째 부분 에서 우리 가 토론 한 것 은 한 줄 을 차지 하 는 기록 입 니 다. 여러 줄 을 차지 하 는 기록 을 분석 하려 면 FS 에 의존 하 는 것 외 에 RS (기록 구분자 변수) 를 설정 해 야 합 니 다. RS 변 수 는 awk 에 게 현재 기록 이 언제 끝 나 는 지, 신기록 이 언제 시작 되 는 지 알려 줍 니 다.
토론 을 편리 하 게 하기 위해 서, 우 리 는 여전히 현재 디 렉 터 리 아래 에 주소록 파일 address 를 생 성 합 니 다. 그 내용 은 다음 과 같 습 니 다.
zhangsan 13712345678 [email protected] lisi 13012345678 [email protected]
이 파일 을 처리 하려 면 세 줄 을 하나의 독립 된 기록 으로 볼 수 있 습 니 다. 하나의 기록 은 세 개의 필드 를 포함 합 니 다. 다음 스 크 립 트 는 원래 기록 을 세 줄 에서 한 줄 로 변환 합 니 다.
 
   
   
   
   
  1. BEGIN { 
  2.     FS="
    "
     
  3.     RS="" 
  4.   
  5.     print $1 ", " $2 ", " $3 

 이 코드 는 다음 과 같은 출력 을 생 성 합 니 다:
zhangsan, 13712345678, [email protected] lisi, 13012345678, [email protected]
위의 예 에서 세 필드 사이 에 쉼표 와 빈 칸 을 삽입 하기 위해 "..." 을 사 용 했 습 니 다. 이 방법 은 유용 하지만 보기 싫 습 니 다. 사실 변수 OFS (출력 필드 구분자) 를 설정 하 는 더 좋 은 방법 이 있 습 니 다. OFS 가 부족 한 경우 "(하나의 빈 칸)" 으로 설정 되 어 있 습 니 다. 다음 스 크 립 트 를 사용 하면 위의 예 와 같은 효 과 를 얻 을 수 있 습 니 다.
   
   
   
   
  1. BEGIN { 
  2.     FS="
    "
     
  3.     RS="" 
  4.     OFS=", " 
  5.   
  6.     print $1, $2, $3 

awk 에는 또 하나의 특수 변수 ORS (출력 기록 구분자) 가 있 습 니 다. ORS 가 부족 한 경우 "" 로 설정 되 어 있 습 니 다. "" 로 설정 하면 출력 기록 의 간격 을 두 배로 늘 릴 수 있 습 니 다. 예 를 들 지 않 고 직접 시도 해 보 세 요. 빈 칸 구분 기록 (줄 을 바 꾸 지 않 음) 은 ORS 를 "" 로 설정 합 니 다.
주의해 야 할 것 은 위의 방법 을 사용 하면 최대 한 개의 기록 이 세 줄 을 차지 하 는 텍스트 만 처리 할 수 있 고 아래 의 기록 이 네 줄 을 차지 하 는 주소록 처럼 처리 할 수 없다 는 것 이다 (여러분 이 한번 해 보 세 요).
wangwu 13512345678 [email protected] wuhan, hubei
 이러한 상황 을 처리 하려 면 코드 는 각 기록 의 필드 수 를 고려 하고 각 기록 을 순서대로 인쇄 하 는 것 이 좋 습 니 다. 다음은 수 정 된 코드 입 니 다.
   
   
   
   
  1. BEGIN { 
  2.     FS="
    "
     
  3.     RS="" 
  4.     ORS="" 
  5.   
  6. {  
  7.         x=1 
  8.         while ( x
  9.                 print $x "\t" 
  10.                 x++ 
  11.         } 
  12.         print $NF "
    "
     

프로그램 출력 은 다음 과 같 습 니 다:
 wangwu 13512345678 [email protected] wuhan, hubei

좋은 웹페이지 즐겨찾기