sed를 사용하여 임의의 문자열을 제외한 모든 것을 삭제하는 방법

sed를 사용하여 임의의 문자열을 제외한 모든 것을 삭제하는 방법

여러분, 문제가 생겼습니다.

샘플 데이터가 있습니다

2021-04-15 07:47:34        629 deveon3/10d/023aad3eab0a035aef3771c9220940e200a00000000242e5_0.gt

나만 필요해

023aad3eab0a035aef3771c9220940e200a00000000242e5

나는 노력한다

grep _0.gt test.txt | sed "s/.* \(.*\) \(...\)\/\(.*\)_0.gt/\1|\2|\3/g"  > test.dat

하지만 결과는 같고 차이는 없습니다.

내가 찾고 있는 것은 내가 갖고 있는 것입니다.

2018-10-20 19:34:23    1668004 000/02001386c62785e42231c679c614228a04000090022ff989_0.gt
2018-10-20 21:18:58    1694936 000/02001386c62785e72231c679c614228a040000000232d761_0.gt
2018-10-20 23:59:40    1828575 000/020057386c6278e72231c679c644228a04000000023696fb_0.gt

출력 받기

1668004|000|02001386c62785e72231c679c614228a04000000015528dd
1694936|000|02001386c62785e72231c679c614228a040000000166bca7
1828575|000|02001386c62785e72231c679c614228a04000000022f8f33

그렇지 않으면

02001386c62785e72231c679c614228a04000000015528dd
02001386c62785e72231c679c614228a040000000166bca7
02001386c62785e72231c679c614228a04000000022f8f33

내가 뭘 잘못했나요?

답변1

awk -F'[_/ ]+' '{ print $5 }' infile

awk -F'[_/ ]+' -v OFS="|" '{ print $3, $4, $5 }' infile

답변2

각 행에서 공백으로 구분된 마지막 필드와 네 번째 필드 /사이에 데이터가 필요하다고 가정해 보겠습니다._

$ awk '{ sub(".*/","",$4); sub("_.*","",$4); print $4 }' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb

sub()이는 네 번째 필드의 마지막 필드 /앞뒤에 나타나는 모든 항목을 자르는 데 두 번 사용됩니다 _. 그런 다음 필드의 나머지 내용을 인쇄합니다.

대체를 사용 하고 다른 문자 sed가 없다고 가정합니다./뒤쪽에우리가 관심을 갖는 데이터:

$ sed 's|.*/||; s/_.*//' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb

세 번째 필드에서 더 많은 정보를 얻고 구분 기호를 로 변경하려면 다음과 같이 사용할 |수 있습니다 .awk

$ awk -v OFS='|' '{ gsub("/",OFS,$4); sub("_.*","",$4); print $3,$4 }' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

/네 번째 필드의 모든 항목을 무엇이든 변경하는 것부터 시작합니다 OFS(출력 필드 구분 기호이므로 |명령줄에서 설정했습니다). 그런 다음 뒤따르는 모든 항목을 잘라내고 이전과 같이 _세 번째 및 수정된 네 번째 필드를 인쇄합니다 .

여기 있습니다. sed약간 어색하긴 하지만 작동합니다.

$ sed 's/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{2\}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

-E또는 확장 정규식을 사용하려면 비표준 옵션을 사용하세요 .

$ sed -E 's/([^[:blank:]]+[[:blank:]]+){2}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

먼저 처음 두 개의 필드와 그 뒤의 공백을 제거한 다음 삭제합니다 _. 마지막으로 모든 공백 및 /를 로 변경합니다 |.

관련 정보