조건부 grep

조건부 grep

다음 내용이 포함된 구성 파일이 있습니다.

    Jobname|Type|Silo|Description
    #comment1
    #comment2
    job1|me|silo1|test_job1
    job1|me|silo1|test_job2
    job1|prod|silo1|test_job3

이제 TYPE =me의 내용과 같은 파일의 조건부 내용이 필요합니다. 이를 위해 grep을 사용합니다.

      job_detail=$((cat config_file | grep me | awk '{print $4}'))

이 경우에는 JOBNAME이 일치하는 문자 me를 가져오기 때문에 첫 번째 줄도 가져옵니다. -v 옵션을 사용하여 주석을 이스케이프 처리했습니다. 구성 파일의 첫 번째 줄은 알 수 없는 다른 프로세스에서 사용되기 때문에 설명할 수 없습니다.

전체 단어 일치를 검색하는 방법이 있습니까? 특정 문자를 기준으로 전체 단어를 파악하는 방법이 있다면 더 좋을 것입니다.

"|"로 줄을 구분한 다음 grep을 사용하는 방법은 무엇입니까?

답변1

노력하다

awk -F\| -v select="$var" '$2 == select { print $4;}' config_file

어디

  • $var선택하려는 필드가 포함되어 있습니다.
  • -F\|는 awk에게 |를 구분 기호로 사용하도록 지시하며, |(pipr)을 이스케이프해야 합니다.
  • -v select="$var" $var를 awk 변수로 전송(선택)
  • $2 == select두 번째 매개변수가 "$var"인 행 또는 선택 항목을 선택합니다.
  • { print $4;}네 번째 필드를 인쇄합니다.

답변2

man grep-w다음 과 같은 플래그가 표시됩니다 .

-w, --word-regexp Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore. 

아니면 | egrep -v Jobname파이프라인에 일찍 참여하세요.

답변3

의 변종아르케마의 솔루션현재 사용자의 사용자 이름인 을 me검색한다고 가정해 보겠습니다 .$LOGNAME

awk -F '|' '$2 == ENVIRON["LOGNAME"] { print $4 }' <config_file

|두 번째 로 구분된 필드를 문자열과 비교하여 $LOGNAME일치하면 네 번째 필드를 인쇄합니다.

또한 주석 처리된 행을 명시적으로 무시합니다.

awk -F '|' '$1 ~ /^#/ { next } $2 == ENVIRON["LOGNAME"] { print $4 }' <config_file

답변4

나는 항상 awk를 선호합니다.

awk -F"|" '{ if ($2~/me/) { print $4 } }' myfile.txt

관련 정보