私は次のようなスクリプトを書いた。
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
追加情報:
上記のコードはループで実行されるため、
$sandbox
毎回新しい値が生成されます。試してみました
grep -e "${sandbox}.*pset
が、問題は解決されませんでした。grep
2つを使用すると問題を解決できますが、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
次のようにできるからです。awk
awk
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
$sandbox
BEGIN
awk
awk
re
答え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とを使用するの[]
が最も簡単なためです。t
grep [abc]oo
aoo
boo
coo
grepするとき固定文字列の使用aを使用すると、
ps
grepプロセスとそのパラメータに対してもgrepを実行できます。上記のトリックでは、REpse[t]
評価結果はpset
固定文字列と一致しませんpse[t]
。
編集者:ゴルフコード
srvc_location=$(ps -ef| grep -m 1 -o ${sandbox}."*pse[t]")
-m 1
一致するパターンのみを印刷-o
matchint パターンのみ出力
答え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
。