次のようなコマンドからの出力行があります。
[]$ <command> | grep "Memory Limit"
Memory Limit: 12345 KB
私は12345を引き出しようとしています。最初のステップ-コロンで区切る-はうまくいきます
[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
12345 KB
これを分離しようとするのはトリッキーです。空白を削除してcut -d ' ' -f1
は、空白ではなく「12345」を返しますか?
コマンドをawkにパイプし、次のように3列目、スペース、4列目を出力します
<command> | awk '{print $3, $4}'
これは結果として:
12345 KB
または
<command> | awk '{print $3}'
裸の番号が必要な場合。
tr ここで役立ちます。
$ echo "Memory Limit: 12345 KB" | tr -s " " | cut -d " " -f3
12345
tr -s " "
-すべてのスペースを1つにまとめますcut -d " " -f3
-スペースで列に分割し、3番目を選択awk
を使用して、cut、sed、regexの使用を回避できます。
_<command> | awk '/Memory Limit/{print $(NF-1)}'
12345
_
/Memory Limit/
_は、_Memory Limit
_テキストを含む行のみを出力します。$(NF-1)
は、入力で_last-1
_ thフィールドを取得します。cut
を使用する必要がありますか? cut
は、単一文字の区切り文字の抽出専用です。カットが思ったほど簡単にできるとは思いません。
sed
は簡単です:
$ echo "Memory Limit: 12345 KB" | sed 's/.*:\s*//'
12345 KB
説明:
.*:\s*
は、最後のコロンの前のすべての文字と一致し、その後のすべての空の文字と一致し、空の文字列に置き換えることによってそれらを削除します。
あなたは単一の数を期待していたことがわかります。その後、私は先に進んで数字を一致させると言います:
$ echo "Memory Limit: 12345 KB" | grep -o -P '\d+'
12345
bash
には、使用できる正規表現マッチングもあります。
result=$(<command> | grep "Memory Limit")
regex='Memory Limit:[[:space:]]+([[:digit:]]+)[[:space:]]KB'
if [[ $result =~ $regex ]]; then
result=${BASH_REMATCH[0]}
else
# deal with an unexpected result here
fi
$regex
の値は、必要に応じて調整できます。
awk
はおそらくこのタスクに最適ですが、これは正統でない方法です
$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs
ラベルを照合して出力のみを照合するための後読み、xargsを使用してスペースを消費する