2017-12-13 15 views
-1

以下のようなファイルでは、 "PRIO"を含むすべての行にそれ以降の値があり、それを出力として出力します。正規表現のbashと一致した後に行内に文字列があるかどうかを調べる

私はgrepでこれを実行しようとしましたが、探している単語が1つだけ出現する場合にのみ一致します。

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

'' cat'の無駄な使い方(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/:フィールドの数は1、その後大きければ `(NF> 1):ラインは単語PRIOアクション{...}
  • {...}を行うが含まれている場合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で、2番目の列はナンバーです。これは '(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

関連する問題