2017-12-13 3 views
-1

다음과 같은 파일에서 필자는 "PRIO"가있는 모든 줄에 값이 있는지 그리고 누락 된 값이 있는지 찾아야합니다. 출력으로.일치하는 정규식 배쉬 ​​후 줄에 문자열이있는 경우

grep을 사용하여이 작업을 시도했지만 단어가 한 번만 나오는 경우에만 일치합니다.

cat PATH_TO_FILE | grep 'PRIO' &> /dev/null 

if [ $? == 0 ]; then 
    echo "matched" 
else 
    echo "not found" 
fi 

파일 구조는

name1 
sdgk 
PRIO  3 


name2 
PRIO 
dsl  dfhhhdf 

name3 
fnslkf hsdhfd  
jlkg;jslk sgdgdsg 
kfasdjmgkdlsgl  sdggsehg 
PRIO 1 


name4 
sdgds 
dsdsgdg 
PRIO    2 
sdgg 
+1

는 어떤 코드 샘플을 알려주십시오 사용 지금까지 노력했다. 그렇게하면 더 효과적으로 당신을 도울 수 있습니다. – Ivonet

+0

[고양이'의 쓸데없는 사용] (http://www.iki.fi/era/unix/award.html) 외에도'$? '를 명시 적으로 검사하는 것을 피하기를 원합니다. 'if'의 목적은 명령을 실행하고 종료 코드를 검사하는 것입니다. 그래서; 'grep -q '^ PRIO. * [0-1]''PATH_TO_FILE; then ... ... ' – tripleee

답변

0

awk를 사용하면 필드 수를 확인하는 것이 매우 간단합니다.

awk '/PRIO/{ str=(NF>1)?"matched":"not found"; print str }' <file>

이 수행합니다

  • /PRIO/을 : 라인이 단어가 포함되어있는 경우 PRIO 행동을 {...}
  • {...}을 수행 : 필드의 수는 더 큰 다음 1 '인 경우 (> NF 1) 1, 그렇지 않으면 일치하지 않습니다.

PRIO은 첫 번째 단어인지 확인하려면, 다음 $1=="PRIO"을 사용하고, 줄 번호를 인쇄하려면 다음

awk '($1=="PRIO"){ str=(NF>1)?"matched":"not found"; print NR,str }' <file>

+0

도움 주셔서 감사합니다. 그리고 만약 "PRIO"(값은 1-5 사이의 범위에 있어야 함)와 매치 한 후에 줄에 숫자 만 나타나는지보고 싶습니까? – wiet

+0

정규식'/^[[: blank :]] * PRIO [[: blank :]] * [1-5] [[: blank]] * $ /'를 사용할 수 있습니다. 첫 번째 열은 PRIO이고 두 번째 열은 양수입니다. 이것은'(NF == 2) && ($ 1 == "PRIO") && ($ 2 ~/[1-5] /)'로 쓰여질 수도 있습니다. – kvantour

0

테스트 할 확실하지하지만

후 값없이 PRIO가 있는지 여부를
$ grep -q 'PRIO\s*$' file 

검사 아래이 하나 simillar 보인다. 샘플 입력에 성공하면 오류 상태로 사용할 수 있습니다.

if grep -q 'PRIO\s*$' file 
then echo "found missing value instance" 
else echo "all instances have values" 
fi 
+0

'\ s'은 대부분의'grep '구현에서 지원되지 않습니다. – tripleee

관련 문제