パイプを使ってANDパターンをつかむ方法

パイプを使ってANDパターンをつかむ方法

私は次のようなスクリプトを書いた。

srvc_location=`ps -ef| grep '${sandbox}.*pset' | head 1 | awk {print $9}`
echo "SERVICE LOC : "$srvc_location

しかし、奇妙なことは、$srvc_locationほとんどの場合問題を解決しますが、時には次のメッセージで解決しないことです。

SERVICE LOC : strrosdev_silo1_int.*pset

追加情報:

  1. 上記のコードはループで実行されるため、$sandbox毎回新しい値が生成されます。

  2. 試してみました grep -e "${sandbox}.*pset が、問題は解決されませんでした。

  3. grep2つを使用すると問題を解決できますが、grep $sandbox |grep psetパターンには1つだけを使用したいと思います。

なぜこれですか?

ベストアンサー1

コードが失敗する理由の1つは、変数の周りの式に二重引用符の'...'代わりに一重引用符を使用するためです。"..."grep

代わりにこれを使用してください

srvc_location=$(ps -ef| grep "${sandbox}.*pset" | head -1 | awk '{print $9}')
echo "SERVICE LOC : $srvc_location"

実際、次のように組み合わせる必要はほとんどありません。なぜなら、head次のようにできるからです。awkawk

srvc_location=$(ps -ef| grep "$sandbox.*pset" | awk '{print $9; exit}')

これもあまり明確ではありませんが、grepここに含まれています。

srvc_location=$(ps -ef| awk -v sb="$sandbox" 'BEGIN { re = sb ".*pset" } $0 ~ re { print $9; exit}')

ここに私たちが使用するいくつかの機能がありますawk。シェル変数の値をとるawk変数を定義します。このブロックは、一致する必要があるパターンを含む変数を定義し、スクリプトの残りの部分は変数の正規表現と一致し、必須フィールドを印刷して完了するとすぐに終了します。sb$sandboxBEGINawkawkre

おすすめ記事