パイプを使って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

答え2

grepはgrepそのものでなければなりません。

あなたは試すことができます

srvc_location=$(ps -ef| grep ${sandbox}."*pse[t]" | awk '{print $9;exit;}')
  • grep "*pse[t]"grepは可能psetですが不可能pse[t]

    pse[t]正規表現(REと呼ばれる)は文字列pseとその中の1文字を表すため、tこの構文は1文字にはほとんど使用されません。通常、who matchとを使用するの[]が最も簡単なためです。tgrep [abc]ooaooboocoo

    grepするとき固定文字列の使用aを使用すると、psgrepプロセスとそのパラメータに対してもgrepを実行できます。上記のトリックでは、REpse[t]評価結果はpset固定文字列と一致しませんpse[t]


編集者:ゴルフコード

srvc_location=$(ps -ef| grep -m 1 -o ${sandbox}."*pse[t]")
  • -m 1一致するパターンのみを印刷
  • -omatchint パターンのみ出力

答え3

コマンドは次のように書くのが最善です。

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

あなたのバージョンはsrvc_locationをps値に設定してから実行し-ef、出力をgrepギターにパイプしようとします。

答え4

これまでに1つだけ追加してください。

注文する

head 1

最初を出力します10ファイルの行数名前付き 1完全に無視されますstdin

(コマンドの該当部分について)必要なものは次のとおりです。

head -1

標準入力の最初の行(1行のみ)を出力します。

または、awkすでに提案されている機能を使用してください。しかし、何でも使うときはこれを知る必要がありますhead

関連情報