Bash: 如何在使用 cut 之前 trim 空格

Bash: How to trim whitespace before using cut

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

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

我正在尝试取出 12345。第一步 - 用冒号分隔 - 工作正常

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

试图将其分开是棘手的。我如何 trim 空格以便 cut -d ' ' -f1 returns "12345" 而不是空白?

你必须使用cut吗? cut 仅用于单个字符分隔符提取。我不认为 cut 可以像你想象的那么容易。

sed 很简单:

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

解释:

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


原来你期待的是一个数字。然后我会说继续并匹配数字:

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

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

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

12345
  • /Memory Limit/ 将使此打印仅包含 Memory Limit 文本
  • 的一行
  • $(NF-1) 将为您提供输入中的第 last-1 个字段。

awk 可能是这个任务的最佳选择,但这里有一个非正统的方法

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

lookbehind 用于匹配标签,只输出匹配,使用xargs 吃掉空格

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,打印第 3 列,space 和第 4 列,如下所示

<command> | awk '{print , }'

这导致:

12345 KB

<command> | awk '{print }'

如果你想要裸号

tr 有帮助。

$ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
12345
  • tr -s " " - 将所有 space 压缩为一个
  • cut -d " " -f3 - 按 space 和 select 第三个
  • 分成列