다음 내용이 포함된 구성 파일이 있습니다.
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