두 개의 awk 명령을 결합하는 방법

두 개의 awk 명령을 결합하는 방법

내 속성 파일에는 다음과 같은 데이터가 있습니다.

domainurl=https://example.com
abc.host=10.5.39.23#10.15.1.5
locator.port=1013#1013
db.cassandra.contactPoints=10.15.13.28,10.35.73.16,10.35.93.4

개별적으로 잘 작동하는 다음 두 명령이 있지만 이를 결합하려고 하면 예상한 결과를 얻지 못합니다. 이것은 명령이다

grep -P '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)'$file | grep '^[^#]'
| awk '/http:\/\//  {print $2,80} 
       /https:\/\// {print $2,443} 
       /Points/     {print $2,"NA"} 
       /host/       {h=$2} 
       /port/       {print h,$2; h=""}'

다음은 Excel 워크시트에서 쉼표로 구분된 값에 대한 또 다른 명령입니다.

awk -F"," '{for(i=1;i<=NF;i++){if(i%NF==0){ORS="\n"} {if($i ~ /^\"/ || $i ~ /\"$/) {a=a OFS $i;j++;{if(j%2==0){sub(/^[[:space:]]/,X,a); print a;j=0;a=""}}} else {print $i}}}}'

결합할 때의 최종 스크립트입니다.아니요예상대로 작동

grep -P '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)' abc.properties | grep '^[^#]' | awk '{split($0,a,"="); print a[1],a[2]}' | awk -F"," '{for(i=1;i<=NF;i++){if(i%NF==0){ORS="\n"} {if($i ~ /^\"/ || $i ~ /\"$/) {a=a OFS $i;j++;{if(j%2==0){sub(/^[[:space:]]/,X,a); print a;j=0;a=""}}} else {print $i}}}}' | awk '/http:\/\//  {print $2,80} 
       /https:\/\// {print $2,443} 
       /Points/     {print $2,"NA"} 
       /host/       {h=$2} 
       /port/       {print h,$2; h=""}' | column -t

실제 출력

http://example.com                                                                   80
 10.15.13.28                                                                         NA
10.5.39.23#10.15.1.5                                                              1013#1013

예상 출력

http://example.com                                                                     80
 10.15.13.28                                                                           NA
 10.35.73.16                                                                           NA
  10.35.93.4                                                                            NA
 10.5.39.23                                                                           1013
 10.15.1.5                                                                            1013

참고: 쉼표(,)로 구분된 해시(#)는 csv 파일의 다음 열에 표시되어야 합니다.

귀하의 답변에 미리 감사드립니다.

답변1

$  grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b|https.*" /tmp/test.txt
https://example.com
10.5.39.23
10.15.1.5
10.15.13.28
10.35.73.16
10.35.93.4

$ cat /tmp/test.txt
domainurl=https://example.com
abc.host=10.5.39.23#10.15.1.5
locator.port=1013#1013
db.cassandra.contactPoints=10.15.13.28,10.35.73.16,10.35.93.4

답변2

나는 그것이 무엇을 하는지 알아내기 위해 코드를 분해하려고 시도하지는 않을 것입니다. 그러나 당신이 그것을 설명할 의향이 있다면 나는 내 대답을 수정할 수 있는지 알아볼 것입니다.

그러나 디버깅의 비결은 각 단계에서 파이프라인의 출력을 검사하여 예상한 결과인지 확인하는 것입니다.

a | b | c예를 들어, and 가 있고 x | y이를 로 결합하려고 하는 것 같습니다 a | b | x | y | c. 또는 다른 것.

따라서 무엇이 작동하지 않는지 알아보려면 a.then 을 확인하세요 a | b. 그런 다음 a | b | x. 등.

답변3

귀하의 제안과 답변에 감사드립니다. 기호를 결합하기 위해 "|"를 사용하는 방법을 알아 냈으며 이것이 원하는 결과를 얻는 최종 코드입니다.

grep -P '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)' $file | grep '^[^#]'| awk '{split($0,a,"="); print a[1],a[2]}'|sed 's/^\|#/,/g'| awk '/http:\/\//  {print $2,80} 
       /https:\/\// {print $2,443} 
       /Points/     {print $2,"9042"} 
       /host/       {h=$2} 
       /port/       {print h,$2; h=""}'|awk -F'[, ]' '{for(i=1;i<NF;i++){print $i,$NF}}'|column -t

관련 정보