2014-09-30 3 views
0

나는 내용을 가진 파일이 :AWK 서브 함수 구문

aaa.bbb.ccc ddd.eee.fff.ggg h.i.j.k 

내가 코드를 사용하는 경우 :

awk '{sub(/\.$/, ""); print $1}' test.txt 
returns aaa.bbb.ccc 

awk '{sub(/\.$/, ""); print $3}' test.txt 
Returns: h.i.j.k 

내가 서브 기능으로 사용됩니다 이해 : (정규 표현식, 대체 서브를, 대상)

나는이 부분을 이해 해달라고. $ /를, 하위 함수에서. . $ 무엇입니까?

감사

UPDATE

좋아, 내가 일을 설명하는 방법을 좋아한다 - 감사합니다!

내가이 실제 예에 적용하는 경우

,

는/usr/빈/호스트 172.0.0.10

01.0.0.172.in-addr.arpa 도메인 이름 포인터 hostname.domain.com을.

  1. /usr/bin/host 172.0.0.10 |/bin/awk '{sub (/.$/, ""); print $ 5} ' 다음을 제공합니다 : hostname.domain.com

  2. /usr/bin/host 172.0.0.10 |/bin/awk '{sub (/.$/, ""); 주는 '} $ 1 인쇄 : "."는이 같은 10.0.0.172.in-addr.arpa

년 - 하위 기능은 라인의 끝에 일치합니다 - 뭐하는거야? - awk가 항목을 열로 분할하는 방법을 모르겠습니까?

답변

0
sub(/regexp/, replacement, target) 
sub(/\.$/, replacement, target) 

귀하의 정규 표현식은 \.$하지 .$/

\이다 이스케이프 문자입니다.그것은 그 다음에 나오는 문자를 이스케이프 처리하므로 문자 그대로 regex 의미에서 처리하고 그대로 처리합니다.

.regex은 단일 문자와 일치합니다. 귀하의 예처럼 \에 의해 이스케이프 처리되지 않은 경우 도트 문자와 일치합니다. .

$은 단순히 줄의 끝을 의미합니다.

이 두 줄을 결합하면 \.$은 줄 끝 부분에 이스케이프 처리 된 점입니다. 이것은 예를 들어 마침표로 끝나는 단락의 끝과 일치합니다. 줄 끝에 더 .이 없기 때문에 awk 단지 1 열을 먼저 인쇄하여 귀하의 예에서

sub은. 귀하의 의견은 .k로 끝나는 (아무 것도 대체하지 않으며, 다른 하나는 3를 인쇄 열입니다.

업데이트 업데이트 된 질문에 대한

.

awk는 기본적으로 공백으로 열에서 문자열을 분할합니다. 따라서 귀하의 의견에, 열은 같다 이 :

당신의 sub 명령
01.0.0.172.in-addr.arpa domain name pointer hostname.domain.com. 
|----------$1-----------|--$2--|-$3-|--$4---|----------$5--------| 

, AWK는 라인의 끝 부분에있는 점을 발견하고 빈 문자열입니다 ""으로 대체 (즉,

첫 번째 명령 ({sub(/.$/, ""); print $5})은 을 아무 것도 교체 (삭제) 한 후 hostname.domain.com. 인 5 번째 열을 인쇄합니다. 패턴이 단지 말에 어떤 문자와 일치하고 삭제 그래서,이 정규식 당신이 더 이상 .를 탈출하지 않는 것이 주목할 필요가

귀하의 다른 명령 (당신의 입력에 . 될 일) - {sub(/.$/, ""); print $1}은 줄 맨 끝에있는 문자를 지운 다음 첫 번째 열만 인쇄합니다. 10.0.0.172.in-addr.arpa

awk에서 사용자 정의 열 구분 기호를 설정할 수도 있습니다. awk에 대한 몇 가지 소개 및 자습서를 읽으십시오. 그것은 작동합니다. 예 : simple awk tutorial

+0

감사합니다. 당신은 설명에 능숙합니다. 나는 확장했다. 업데이트 – Matzuba

+0

업데이트 된 질문을 포함하도록 내 게시물을 편집했습니다. – confused00

+0

시간을내어이 단계를 수행해 주셔서 다시 한번 감사드립니다. 나는 기본적으로 공백으로 분할에 대해 몰랐고 그것을 "영리한 뭔가를하고 있다고 생각했다." 매우 건설적인 대답과 나는 awk와 regex를 더 읽을 것이다. 당신의 시간을 기쁘게, 명성! – Matzuba

0

sub(regexp, replacement, target)

그래서 여기에 우리가 끝에있는 점과 일치 \.$로 정규식을 사용했다. 여기 sub(/\.$/, "") 우리는 대상을 언급하지 않았으므로 $0 즉 전체 줄을 사용합니다. 대상을 지정하면 해당 특정 열의 마지막 도트 만 제거됩니다.

awk '{sub(/\.$/, ""); print $1}' test.txt 

만 인쇄 라인의 마지막에 도트가 없으면 만 컬럼 (1)의 단부에 존재했던 점을 제거하고 교체가 일어나지 않음. 마지막에 닷이없는 3의 때문에

awk '{sub(/\.$/, ""); print $3}' test.txt 

은 그 자체로는 세 번째 열 일명 마지막 열을 반환 라인 및 인쇄 단지 열의 끝에서 점을 제거합니다.

예 :

$ cat file 
aaa.bbb.ccc. ddd.eee.fff.ggg h.i.j.k. 
$ awk '{sub(/\.$/, ""); print $1}' file 
aaa.bbb.ccc. 
$ awk '{sub(/\.$/, ""); print $3}' file 
h.i.j.k