awk에서 여러 구분 기호 사용


202

다음 줄이 포함 된 파일이 있습니다.

/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

위의 출력에서 ​​3 개의 필드 (번호 2, 4 및 마지막 필드)를 추출하려고합니다 *.example.com. 다음과 같은 결과가 나타납니다.

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

도메인 이름을 가진 마지막 필드는 어떻게 추출 '='합니까? multiple delimiter필드를 추출 하는 데 어떻게 사용 합니까?


2
동일하지만 다른 내 질문에 대답하기 awk위해 필드 번호가 비어있는 필드가 비어있을 때 필드를 삼키는 것이 었습니다. 나는 변경 -F " "-F "[ ]"awk더 이상 빈 필드를 삼키지 않았다.
Adam

답변:


324

분리 문자는 정규식 일 수 있습니다.

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

생산 :

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

42
물론 cat프로세스는 필요하지 않습니다 awk '...' file.. 또한 출력 필드 구분 기호를 사용하는 것이 더 깔끔합니다.awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
glenn jackman

17
Awk 구분 기호는 정규 표현식이 될 수 있습니다.
das.cyklone

4
@ das.cyklone : awk는 또한 다음과 같은 여러 구분 기호를 가질 수 있습니다 |: ex : awk -F 'this|that|[=/]' '......' (단어를 구분하는 단어 / 문자열을 갖는 |[ \t]+데 유용합니다) 까다로운 ... 'this'앞뒤에 빈 공간이 자주 있기 때문에 공백과 'this'사이에 빈 칸이 두 개 더 나타납니다.
Olivier Dulac

나는 이것을 2 개의 다른 배포판에서 시도했지만 동일한 동작을 얻습니다. netstat -ntpl "netstat -ntpl | sed 's / : / /'| awk '{print $ 5}'"에서 포트를 가져 오려고하지만 doulbe 배관없이 할 수 있습니다. 이것은 효과가 있지만 필드 17에 대한 데이터를 기대하지 않았습니다. "netstat -ntpl | awk -F"| : " '{print $ 17}'"
louigi600

2
예 ... 이것은 내가 원하는 것을 얻었습니다 : awk -F "[:] +" '/ \ / postmaster * $ / {print $ 5}'
louigi600

44

좋은 소식! awk필드 구분 기호는 정규식 일 수 있습니다. 다음을 사용해야합니다 -F"<separator1>|<separator2>|...".

awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file

보고:

tc0001  tomcat7.1  demo.example.com
tc0001  tomcat7.2  quest.example.com
tc0001  tomcat7.5  www.example.com

여기:

  • -F"/|="입력 필드 구분 기호를 /또는로 설정합니다 =. 그런 다음 출력 필드 구분 기호를 탭으로 설정합니다.

  • -vOFS='\t'은 USING 인 -v변수를 설정하기위한 플래그. OFS출력 필드 구분 기호의 기본 변수이며 탭 문자로 설정됩니다. OFS와 같은 내장 기능이 없으므로 플래그가 필요 -F합니다.

  • {print $3, $5, $NF} 입력 필드 구분 기호를 기준으로 3 번째, 5 번째 및 마지막 필드를 인쇄합니다.


다른 예를보십시오 :

$ cat file
hello#how_are_you
i#am_very#well_thank#you

이 파일에는 두 개의 필드 구분 기호 #와가 _있습니다. 구분 기호가 하나인지에 관계없이 두 번째 필드를 인쇄하려면 둘 다 구분 기호로 만드십시오!

$ awk -F"#|_" '{print $2}' file
how
am

파일 번호는 다음과 같습니다.

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6

1
편집 해 주셔서 감사합니다 @BUFU. FS 부분에 초점을 맞추기 위해 OFS 참조를 제거했지만 그것을 갖는 것도 좋습니다. 건배!
fedorqui 'SO 중지'

5

공백이 일관된 경우 \t직접 삽입하는 대신 구분 기호로 사용할 수 있으며 출력 구분 기호를 설정하면 자동으로 포함됩니다.

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

3

숫자 2를 통 5하거나 문자로 구분 한 필드 구분 기호a 또는 #분리 특성은, 예를 들면, 적어도 2 배 이상, 6 번 반복해야 또는 공간 :

awk -F'[2-5a# ]{2,6}' ...

() 및 매개 변수를 사용하여 변형이 존재한다고 확신합니다.


3

펄 원 라이너 :

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

다음과 같은 명령 줄 옵션이 사용됩니다.

  • -n입력 파일의 모든 줄을 반복하고 $_변수에 줄을 넣고 모든 줄을 자동으로 인쇄하지는 않습니다.

  • -l 처리하기 전에 줄 바꿈을 제거하고 나중에 다시 줄 바꿈

  • -a자동 분할 모드 – perl은 입력 라인을 @F어레이 로 자동 분할합니다 . 공백으로 기본 분할

  • -F자동 분할 수정 자 (이 예에서는 /또는=

  • -e 펄 코드를 실행

Perl은 awk와 밀접한 관련이 있지만 자동 @F분할 배열은 인덱스에서 시작 $F[0]하지만 awk 필드는 $ 1로 시작합니다.


2

또 다른 방법은 -F 옵션을 사용하지만 정규식을 전달하여 왼쪽과 오른쪽 괄호 사이에 텍스트를 인쇄하는 것 ()입니다.

파일 내용 :

528(smbw)
529(smbt)
530(smbn)
10115(smbs)

명령 :

awk -F"[()]" '{print $2}' filename

결과:

smbw
smbt
smbn
smbs

awk를 사용하여 사이에 텍스트를 인쇄하십시오. [] 다음 .

사용 awk -F'[][]' 하지만 awk -F'[[]]'작동하지 않습니다.

http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html


귀하의 답변은 삭제 대기열에 나타났습니다. 10 회 중 9 회, 자신의 블로그에 1 개의 평판을 연결하는 사용자는 대개 스팸입니다. 그러나 당신의 규칙은 예외입니다. 지난 10 년간의 내용에는 금광이 있으며,이를 통해 불멸의 계획이 있기를 바랍니다.
에릭 레친 스키

0

보드에 많은 완벽한 답변이 있지만 여전히 코드를 업로드하고 싶습니다.

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'


2
print $3 " " $5 " " $7로 인쇄 할 수 있습니다 print $3, $5, $7. 또한 awk를 사용한 다음 sed로 파이핑하는 이점이 없습니다. 일반적으로 awk로 충분하고 다른 사람들은 그 사실을 알 수 있습니다.
fedorqui 'SO 중지 피해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.