파일이 있습니다abc.txt이런 자료가 있어요 -
abc pqr testing, xyz=a432j42jjk4, key=124
abc pqr testing, xyz=jkl234j54nn, key=567
abc pqr testing, xyz=2395hdshkw4, key=3232
abc pqr testing, xyz=abc424729hh, key=7676
abc pqr testing, xyz=70700ghgh99, key=12342
나는 awk를 사용하여 다음과 같은 "xyz" 텍스트를 검색하고 있습니다.
awk -F"xyz=" '{print $2}' abc.txt | awk '{print $1}'
이것은 나에게 새로운 라인으로 출력을 제공합니다 -
a432j42jjk4,
jkl234j54nn,
2395hdshkw4,
abc424729hh,
70700ghgh99,
awk에서 개행 문자를 제거하면서 출력을 얻을 수 있는 바로가기나 트릭을 찾고 있습니다.
답변1
GNU를 사용하여 grep
다음을 구현하십시오.
$ grep -o -P '(?<=\bxyz=)[^,]+,' abc.txt
grep
주어진 정규식과 일치하는 줄을 인쇄합니다. 우리는 -o
줄의 일치하는 부분만 인쇄되도록 정의합니다. 정규식 은 -P
Perl 정규식으로 해석되어 더 많은 옵션을 제공합니다.
정규식은 다음과 같이 말합니다.
,
( ) 가 아니고[^,]+
다음으로 끝나는 다른 문자를 찾아보세요.,
xyz=
(?<=\bxyz=)
이러한 연속 문자는 양수라고 불리는 a 뒤에 와야 합니다.뒤를 봐). 우리는\b
grep이나 그와 유사한 것을 하지 않도록 합니다.booxyz=
답변2
내장된 일치 기능을 사용하여 awk
명령을 더욱 단순화할 수 있습니다.
$ awk -F ',' '/xyz=/ {split($2,a,"="); print a[2]}' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
여기서는 나중에 빈 줄을 제거하기 위해 이 명령문을 사용할 필요가 없도록 awk
포함된 줄을 일치시키는 데 사용합니다 .xyz=
if
논리가 왼쪽에서 오른쪽으로 더 많이 흐르기 때문에 더 읽기 쉬워 보입니다.
xyz=
이 솔루션은 쉼표로 구분된 파일의 두 번째 필드가 아닌 필드에서 발생하는 상황을 방지하지 못합니다 .
답변3
기준을 사용 awk
하고 찾고 싶다고 가정하십시오.xyz=
구체적으로두 번째 쉼표로 구분된 필드에 있습니다.
$ awk -F ',' '{ split($2,a,"="); if (a[1] == " xyz") print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
또는,
$ awk -F ',' '{ split($2,a,"=") } a[1] == " xyz" { print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
이는 입력을 쉼표로 구분된 필드가 있는 줄로 구성된 것으로 처리합니다. 코드의 실제 본문은 awk
쉼표로 구분된 두 번째 필드를 위의 하위 필드로 분할한 다음, =
첫 번째 필드가 문자열(쉼표 앞의 초기 공백 포함)인 경우 xyz
그 안의 두 번째 필드를 인쇄합니다 .
a[1]
빈 행은 해당 행에서 필요한 값을 얻을 수 없으므로 삭제됩니다 .
각 출력 줄 끝에 추가 쉼표를 추가하려면 를 사용하십시오 print a[2] ","
.