match_E2
일치하는 문자열( sum pattern_2
)과 첫 번째 열만 가져오려고 합니다 .
abcd.corp;;a123,Virtual,aws,Linux,Linux,match_E2,Database
web1.corp;;,Virtual,azure,match_E2,Linux,corpo,Database
web2.corp;;match_E2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_2,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database
예상 출력은 다음보다 낮을 수 있습니다.
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2
-o
옵션을 사용해 보았지만 grep
일치하는 문자열만 제공합니다.
답변1
감히 말씀드리자면 귀하의 사건은 더 잘 처리될 수 있을 것입니다 sed
.
패턴 의 경우 match_E2
:
$ sed -nE 's/^([^;]+).*(match_E2).*/\1,\2/p' file.txt
패턴 의 경우 pattern_2
:
$ sed -nE 's/^([^;]+).*(pattern_2).*/\1,\2/p' file.txt
두 가지 모드를 동시에 사용하려면:
$ sed -nE 's/^([^;]+).*(match_E2|pattern_2).*/\1,\2/p' file.txt
즉, 기본적으로 다음과 같습니다.
$ sed -nE 's/^([^;]+).*( ).*/\1,\2/p' file.txt
# ^ ^
# | |
# ---------------------
# put within these two parentheses the same (Extended Regular Expression) pattern you would use with `grep -E`
;
첫 번째 필드와 나머지 행 사이의 구분 기호 중 하나 이상에만 의존한다는 점에 유의하세요 .
답변2
다음 awk
명령은 원하는 작업을 수행해야 합니다.
awk -F'[;,]' -v pat="match_E2" '$0~pat{for (i=3;i<NF;i++) {if ($i ~ pat) printf("%s,%s\n",$1,$i)}}' file.txt
이 옵션은 및를 필드 구분 기호 로 인식 하고 이에 따라 행을 분할하도록
-F'[;,]'
지시합니다 .awk
;
,
POSIX 표준에서는 이러한 다중 문자 필드 구분 기호를 완전한 정규식으로 해석하도록 요구하지만awk
이 기능을 올바르게 구현하지 않는 버전이 있을 수 있습니다.모드는
-v pat="match_E2"
명령줄 옵션을 통해 모드를 통해 awk로 전달됩니다.이렇게 하면 패턴이 완전한 정규식으로 해석됩니다. 이 문맥에서 그 안에 있는 문자가 특별한 의미를 갖고 있다면 이스케이프 처리해야 합니다!현재 줄이 패턴과 일치하면( "전체 줄이
$0 ~ pat
어딘가에 저장된pat
정규식과 일치하는 경우"를 의미) 모든 관련 필드(필드 3은 마지막 필드 다음의 첫 번째 필드;
)를 반복하고 실제 일치하는 필드(조건if ($i ~ pat)
)를 식별합니다. 그런 다음 첫 번째 필드($1
)와 일치하는 필드( )를 인쇄하여 이를 수행합니다$i
printf()
.이는 일치하는 행에 해당 필드가 하나만 있을 수 있다고 가정합니다.!
여러 패턴을 찾고 있다면 pat
다음과 같이 그에 따라 정규식을 공식화 할 수 있습니다.
awk -F'[;,]' -v pat="match_E2|pattern_2" ' ... etc ... '
또는 각 모드에 대해 한 번씩, 명령을 두 번 실행하십시오.
답변3
grep -o
다음 기능을 사용하는 awk 버전과 비슷 합니다 match
.
$ awk -F';' 'match($0,/match_E2|pattern_2/) {print $1 "," substr($0,RSTART,RLENGTH)}' file
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2
답변4
이는 전체 리터럴 문자열 일치를 수행하므로 대상 문자열에 정규식 메타 문자가 포함되어 있거나 입력에서 하위 문자열로 나타나는 경우에도 작동합니다.
$ awk '
BEGIN { strs["match_E2"]; strs["pattern_2"]; FS=";"; OFS="," }
{ for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2
부분 일치와 완전 일치의 예를 보려면 다음 입력을 고려하세요.
$ cat file
abcd.corp;;a123,Virtual,aws,Linux,Linux,mismatch_E2,Database
web1.corp;;,Virtual,azure,match_E2,Linux,corpo,Database
web2.corp;;match_E2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_275,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database
이제 입력의 첫 번째 줄에는 mismatch_E2
and 가 포함 match_E2
되고 네 번째 줄에는 pattern_275
and and not 이 포함됩니다 pattern_2
. 이제 위의 awk 스크립트를 실행하고 예상한 출력이 생성되는지 확인하세요.
$ awk '
BEGIN { strs["match_E2"]; strs["pattern_2"]; FS=";"; OFS="," }
{ for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
web1.corp,match_E2
web2.corp,match_E2
web4.corp,pattern_2
정규식과 문자열 일치의 예를 보려면 match_E2
입력의 1행을 다음으로 변경 m.*2
하고 patch_2
4행을 다음으로 변경합니다.p.*2
$ cat file
abcd.corp;;a123,Virtual,aws,Linux,Linux,m.*2,Database
web1.corp;;,Virtual,azure,m.*2,Linux,corpo,Database
web2.corp;;m.*2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_2,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database
위의 awk 스크립트를 수정하여 m.*2
and 대신 p.*2
에 예상한 출력이 생성되는 것을 다시 확인했습니다.match_E2
pattern_2
$ awk '
BEGIN { strs["m.*2"]; strs["p.*2"]; FS=";"; OFS="," }
{ for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
abcd.corp,m.*2
web3.corp,p.*2