패턴과 일치하기 전에 단어를 찾으려면 grep을 사용하세요.

패턴과 일치하기 전에 단어를 찾으려면 grep을 사용하세요.

다음과 같은 출력이 있습니다. 텍스트 앞의 숫자를 추출하고 싶습니다. 예를 들어, 나는 그것이 나타나기를 TrainIdentifyBusinessError원합니다 . 1612나는 grep 하고 그것이 나타나기를 TrainIdentifyTechnicalError원합니다 .3

1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 3 TrainIdentifyTechnicalError

답변1

당신은 사용할 수 있습니다 sed... 예를 들어

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyBusinessError.*/\2/p' file
1612

또는

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifySuccess.*/\2/p'
252

또는

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyTechnicalError.*/\2/p'
3
  • -n우리가 요청할 때까지 아무것도 인쇄하지 마세요
  • -rERE를 사용하세요
  • .*줄에 있는 모든 문자 수
  • ( |^)공백 또는 줄의 시작
  • ([0-9]+)하나 이상의 숫자 및(save this)
  • \2두 번째에 대한 역방향 참조(saved pattern)
  • p편집된 라인을 인쇄하세요

나중에 생각해 보면... 이 작업을 정기적으로 수행해야 하는 경우 다음과 같은 쉘 함수를 만들 수 있습니다(예를 들어 bash를 사용하는 경우 쉘 ~/.*rc파일 에 추가).~/.bashrc

getnum() { sed -nr 's/.*( |^)([0-9]+) TrainIdentify'"$1"'.*/\2/p' "$2" ; }

사용 예(명령줄에서 필드 및 파일 이름 지정 - 파일이 항상 동일한 파일인 경우 대신 함수 내에 전체 경로를 입력할 수 있음 "$2"):

$ getnum BusinessError file
1612
$ getnum TechnicalError file
3
$ getnum Success file
252

답변2

grep이는 Perl 확장(플래그)을 사용하여 해결할 수 있습니다 -P. 3다음에서 가져오세요 TrainIdentifyTechnicalError:

$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyTechnicalError)"
23 

1612시작하려면TrainIdentifyBusinessError

$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyBusinessError)"
1612 

관련 정보