문자열을 검색하고 동일한 awk 명령으로 잘라냅니다.

문자열을 검색하고 동일한 awk 명령으로 잘라냅니다.

파일이 있습니다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줄의 일치하는 부분만 인쇄되도록 정의합니다. 정규식 은 -PPerl 정규식으로 해석되어 더 많은 옵션을 제공합니다.

정규식은 다음과 같이 말합니다.

  • ,( ) 가 아니고 [^,]+다음으로 끝나는 다른 문자를 찾아보세요.,
  • xyz= (?<=\bxyz=)이러한 연속 문자는 양수라고 불리는 a 뒤에 와야 합니다.뒤를 봐). 우리는 \bgrep이나 그와 유사한 것을 하지 않도록 합니다.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] ",".

관련 정보