次のようなものを含む foo.sh というスクリプトがあります
exec myapp -o size=100m -f
foo.sh を解析して値を取得する別のスクリプトを作成する方法はありますsize
か? myapp は foo.sh に 1 回しか現れないと想定できますが、引数の順序はsize
引数リストのどこにでも現れる可能性があります。
ありがとう
シェルでgrepを使用:
$ grep -oP 'myapp.*?size=\K\d+m' foo.sh
100m
シェルでawkを使用:
$ awk -F'size=' '{sub(/ -f/, "");print $2}' foo.sh
100m
また
$ awk '{print gensub(/.*size=([0-9]+m).*/, "\\1", $0)}' foo.sh
100m
シェルでperlを使用する場合:
$ perl -lne 'print $1 if /exec.*?size=(\d+m)/' foo.sh
100m
または、シェルの面白いトリックを使用します:
$ declare $(grep -oP "\b\w+=\w+\b" foo.sh)
$ echo $size
100m
sed アプローチのバリエーション。これは、ラインが見つかると短絡します。ファイルが非常に長く、ターゲットが最初に近い可能性がある場合に役立ちます。
sed -ne '/exec myapp -o size=/{s/[^0-9]*\([m0-9]*\).*/\1/;p;q;}'
正しい行が見つかると、サイズの値を抽出して印刷し、終了します。
cat foo.sh | egrep -o 'size=[[:digit:]]+' | awk -F= '{print $2}'