web-dev-qa-db-ja.com

Bash:カットを使用する前に空白を削除する方法

次のようなコマンドからの出力行があります。

[]$ <command> | grep "Memory Limit"
Memory Limit:           12345 KB

私は12345を引き出しようとしています。最初のステップ-コロンで区切る-はうまくいきます

[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
           12345 KB

これを分離しようとするのはトリッキーです。空白を削除してcut -d ' ' -f1は、空白ではなく「12345」を返しますか?

13
user2824889

コマンドをawkにパイプし、次のように3列目、スペース、4列目を出力します

<command> | awk '{print $3, $4}'

これは結果として:

12345 KB

または

<command> | awk '{print $3}'

裸の番号が必要な場合。

12
John Goofy

tr ここで役立ちます。

$ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
12345
  • tr -s " "-すべてのスペースを1つにまとめます
  • cut -d " " -f3-スペースで列に分割し、3番目を選択
6

awkを使用して、cut、sed、regexの使用を回避できます。

_<command> | awk '/Memory Limit/{print $(NF-1)}'

12345
_
  • _/Memory Limit/_は、_Memory Limit_テキストを含む行のみを出力します。
  • $(NF-1)は、入力で_last-1_ thフィールドを取得します。
5
anubhava

cutを使用する必要がありますか? cutは、単一文字の区切り文字の抽出専用です。カットが思ったほど簡単にできるとは思いません。

sedは簡単です:

$ echo "Memory Limit:           12345 KB" | sed 's/.*:\s*//'
12345 KB

説明:

.*:\s*は、最後のコロンの前のすべての文字と一致し、その後のすべての空の文字と一致し、空の文字列に置き換えることによってそれらを削除します。


あなたは単一の数を期待していたことがわかります。その後、私は先に進んで数字を一致させると言います:

$ echo "Memory Limit:           12345 KB" | grep -o -P '\d+'
12345
2
Jason Hu

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の値は、必要に応じて調整できます。

1
chepner

awkはおそらくこのタスクに最適ですが、これは正統でない方法です

$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs

ラベルを照合して出力のみを照合するための後読み、xargsを使用してスペースを消費する

0
karakfa