Grep을 사용하여 줄의 시작 부분만 필터링하고 표시

Grep을 사용하여 줄의 시작 부분만 필터링하고 표시

(MacOSX를 사용하며 이것을 Perl 스크립트로 변환할 수 있습니다). 저는 Linux/Unix 명령을 처음 사용하는데 Google 검색에 실패했습니다.

누군가의 훈련 기록을 빠르게 검색할 수 있도록 스크립트를 작성 중입니다. 내가 하는 방법은 개인의 훈련 기록을 한 줄에 나열하는 것입니다(아마도 더 좋은 방법이 있을까요?). Grep을 사용하여 특정 이름, 훈련받은 직위 또는 날짜를 검색하면 전체 라인이 표시됩니다. 특정 문자열을 검색하여 줄의 시작 부분(즉, 처음 2개 단어(이름/성))만 표시하고 싶습니다.

Training.txt 파일은 다음과 유사합니다.

Ivie, Shawn 계산원 2016년 5월 24일 창고 2016년 12월 2일 서비스 데스크 2016년 11월 31일

Allen, Adam Cashier 2016년 5월 10일 저장실 2016년 12월 13일

마르티네즈, 제시카 계산원 2017년 5월 20일 창고 2016년 10월 29일 감독자 2016년 1월 23일

지금 사용하는 명령은 다음과 같습니다. grep "Cashier" Training.txt

3개의 레코드, 즉 모든 레코드의 전체 줄 내용을 모두 반환합니다.

난 노력 했어: grep -E -o ".{0,0}Cashier.{0,5}" Training.txt

이 예에서는 3개의 레코드가 모두 반환되지만 "Cashier" 앞에는 0개의 문자가 표시되고 뒤에는 5개의 문자가 표시됩니다.

Cashier 5/10

grep(또는 Perl 명령)을 통합하여 "Supervisor"를 검색하고 처음 2개 단어(이름)만 표시하려면 어떻게 해야 합니까? 보조: 이러한 유형의 프로세스를 더 쉽게 만들 수 있는 아이디어가 있습니까? (이 경우 스프레드시트는 유용하지 않습니다.)

답변1

이는 다음과 같은 경우에 적합합니다 awk.

awk '/Supervisor/ { print $1, $2 }' /path/to/inputfile

"Supervisor Bob"이라는 사람에 대해 잘못된 긍정을 얻지 않도록 검색을 세 번째 필드로 제한할 수도 있습니다.

awk '$3 ~ /Supervisor/ { print $1, $2 }' /path/to/inputfile

답변2

grep다음 모드를 사용하여 사용할 수 있습니다 Perl.

grep -oP '^(\S+,?\s+){2}(?=Cashier\s)'

결과

Ivie, Shawn
Allen, Adam
Martinez, Jessica

일하고 있는

  • Perl 모드에서 grep은 줄 시작 부분에서 두 개의 필드(\S+)를 찾습니다.
  • 그리고 두 번째 필드의 공백 끝에 서서 계산원과 공백이 차례로 표시되면 일치하는 항목을 찾은 것입니다. Cashier 문자열은 둘러보기용이므로 일치 항목에 포함되지 않습니다.

관련 정보