다음과 같은 출력이 있습니다. 텍스트 앞의 숫자를 추출하고 싶습니다. 예를 들어, 나는 그것이 나타나기를 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
우리가 요청할 때까지 아무것도 인쇄하지 마세요-r
ERE를 사용하세요.*
줄에 있는 모든 문자 수( |^)
공백 또는 줄의 시작([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