까다로운 grep 명령

까다로운 grep 명령

공백으로 구분된 데이터 줄이 포함된 텍스트 파일이 있습니다.

예:

B  345678  2005-12-21  4174  1  62  11111 16543 1911  786543,45

그러나 간격이 약간 일치하지 않으며 때로는 추가된 탭도 있는 것으로 의심됩니다. 모든 줄에 항상 나타나는 숫자인 "62" 앞의 줄을 자르는 방법을 찾아야 합니다. 이 숫자는 항상 모든 줄에 나타나고 때로는 5자리 숫자가 따라오고 그 다음에는 항상 또 다른 5자리 숫자가 옵니다. 또한 불일치 위험을 최소화하기 위해 62 앞에 공백을 추가했습니다.

지금까지 나는 이것을 생각해 냈습니다.

grep " 62 [1-9][0-9][0-9][0-9][0-9] " file

이렇게 하면 가끔 5자리 숫자가 나타나는 줄만 제공됩니다. 62를 grep하고 그 뒤에 선택적으로 5자리 숫자, 그 다음에는 필수 5자리 숫자를 입력하는 방법이 필요합니다.

이것이 가능합니까?

/폴

답변1

62를 grep하고 그 뒤에 선택적으로 5자리 숫자, 그 다음에는 필수 5자리 숫자를 입력하는 방법이 필요합니다.

이는 그 뒤에 1~2개의 5자리 숫자가 있다고 말하는 것과 같으며 62, 첫 번째 숫자만 일치시키면 충분합니다. 다양한 수의 공백을 처리하는 것은 쉽습니다. 을 사용 ␣+하거나 [[:space:]]+탭을 포함할 수 있습니다.

그래서,

grep -E ' 62 +[1-9][0-9]{4} '

또는

grep -E '[[:space:]]62[[:space:]]+[1-9][0-9]{4}[[:space:]]'

물론 전체 줄이 인쇄됩니다. 62부터 시작하는 부분만 필요한 경우 .*줄 끝 부분과 일치하도록 추가하고 -o일치하는 부분만 인쇄합니다.

grep -o -E '[[:space:]]62[[:space:]]+[1-9][0-9]{4}[[:space:]].*'

답변2

awk이 목적으로 사용할 수 있습니다 :

awk '{if (match($0, "(^[[:print:]]*[[:space:]]+)?(62([[:space:]]+[1-9][0-9]{4})?([[:space:]]+[[:print:]]*)?[[:space:]]+[1-9][0-9]{4}([[:space:]]*|[[:space:]]+[[:print:]]*)$)", a)!=0) print a[2];}' file.txt

62이것은 시작 부분이나 앞에 인쇄 가능한 문자 수, 하나 이상의 공백 문자, 다음 중 고아가 있는 모든 행과 일치합니다.

  • 선택적 공백 및 5자리 숫자
  • 선택적으로 인쇄 가능한 문자 수
  • 강제 공백 및 5자리 숫자
  • 선택적으로 하나 이상의 공백과 인쇄 가능한 문자 수 또는 후행 공백

이러한 패턴이 발견되면 해당 줄의 처음 62부터 끝까지 인쇄됩니다.

이는 구분 공백을 압축하지 않으므로 "일관되지 않은 공백"이 있는 그대로 출력에 복사됩니다.

답변3

...62 이전의 모든 항목을 삭제합니다(.....)

perl -pe 's/.*?(?= 62 +[1-9]\d{4} )//'

어디:

  • s/.*?...// - 모든 것을 제거한다는 의미 = 아무것도 교체하지 않음
  • .*?(?= 62) - 62 이전의 콘텐츠를 의미합니다...

답변4

나는 추천한다

grep -E '\b62([[:blank:]]+[[:digit:]]{5}\b){1,2}'

\b줄의 시작 부분이나 단어가 아닌 문자(예: 공백) 뒤에 "62"가 나타날 수 있도록 하는 단어 경계는 어디에 있습니까?

관련 정보