Bash:如何在使用剪切之前修剪空白

时间:2016-08-05 15:34:52

标签: bash trim cut

我有一行输出来自这样的命令:

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

我试图拔出12345.第一步 - 用冒号分开 - 工作正常

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

试图将其分开是个棘手的问题。如何修剪空白以便cut -d ' ' -f1返回&#34; 12345&#34;而不是空白?

6 个答案:

答案 0 :(得分:10)

将命令传递给awk,打印第3列,空格和第4列,如下所示

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

这导致:

12345 KB

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

如果你想要裸照号码。

答案 1 :(得分:6)

tr有帮助。

$ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
12345
  • tr -s " " - 将所有空格挤入一个
  • cut -d " " -f3 - 按空格分割成列并选择第三个

答案 2 :(得分:5)

您可以使用awk并避免使用任何剪切,sed或正则表达式:

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

12345
  • /Memory Limit/会使此打印仅与Memory Limit文字
  • 一致
  • $(NF-1)会在输入中为您提供last-1字段。

答案 3 :(得分:2)

你必须使用cut吗? cut仅用于单字符分隔符提取。我不认为剪切可以像你期望的那样容易。

sed很简单:

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

说明:

.*:\s*匹配最后一个冒号之前的所有字母,然后匹配之后的所有空字符,并通过替换为空字符串来删除它们。

事实证明你期待一个号码。然后我会说继续前进并匹配数字:

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

答案 4 :(得分:1)

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的值可以根据需要进行调整。

答案 5 :(得分:0)

awk也许是这项任务的最佳选择,但这是一种非正统的方式

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

lookbehind匹配标签和输出只匹配,使用xargs占用空间