2017-07-20 36 views
1

私はlynisを使って私が使っているAMIを監査しています。 lynisが実行された後、/var/log/lynis.logに書き込まれ、amiの全体的な硬化を評価するために「硬化インデックス」スコアが与えられます。シェルスクリプト内の文字列の部分文字列を分離する

私は順番に私にこのラインを与えるsudo cat /var/log/lynis.log | grep "Hardening Index"

を実行してこの値を取得する:

2017-07-20 10:45:10 Hardening index : [58] [###########   ] 

私の質問は、私はif文の比較のために変数に代入される58をどのように分離するかされます。私はsedやregexを使うことを考えていましたが、この値はamiに依存して異なり、0-100の範囲でありうるため、その値を抽出する方法は考えられません。どんな助けもありがとう。

+0

'grepの-OP '硬化指数\ bの。* \ [\ K \ dの+は' 幻想 –

答えて

3

あなたはawkを使用しても、あなたのgrepをスキップすることができます

awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log 
58 

このawkフィールドセパレータとして[又は]を使用し、2番目のフィールドを抽出します。このようなとcat正規表現Hardening [Ii]ndexと一致するレコード。

は変数でこれを保存するには:

var=$(awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log) 
+1

この作品をpath.log'!私はawkコマンドに慣れていません。もう少し説明してください - F '[] [] +'は正規表現チェックのために文字列を区切り/解析しますか? – DevLuke

+0

'-F '[] [] +''は、ブラケット式を使用してフィールドセパレータを '['または ']'文字の1つ以上として設定します。 – anubhava

2

シェルで外部プロセスを生成を避けるために(セクションの一番下までスクロール)POSIX parameter expansion facilitiesを使用することを行うには、計算上最も安い方法:

$ var='2017-07-20 10:45:10 Hardening index : [58] [###########   ]' 
$ var=${var%%\]*} #remove longest endstring starting with ] 
$ var=${var##*\[} #remove longest startstring ending with [ 
$ echo $var 
    58 
0

で試してみてください:

sudo cat /var/log/lynis.log | grep "Hardening Index" | sed -r "s/.*?\[([0-9]+)\].*/\1/" 
0

試して、次のawkすぎて一度。

awk '{match($0,/Harden[Ii]ng index.[^\]]*/);print substr($0,RSTART+RLENGTH-2,2)}' Input_file 
0
sudo cat /var/log/lynis.log | grep "Hardening [Ii]ndex"|sed -r 's/[^[]*\[([^]]*).*/\1/' 
+0

このコードをご利用いただきありがとうございます。すぐに役立つかもしれません。適切な説明は、なぜ*これが問題の良い解決策であるかを示すことによってその教育上の価値を大幅に改善し(// meta.stackexchange.com/q/114762)、将来の同様の、しかし、同一ではない質問。説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

関連する問題