我有一行输出来自这样的命令:
[]$ <command> | grep "Memory Limit"
Memory Limit: 12345 KB
我试图拔出12345.第一步 - 用冒号分开 - 工作正常
[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
12345 KB
试图将其分开是个棘手的问题。如何修剪空白以便cut -d ' ' -f1
返回&#34; 12345&#34;而不是空白?
答案 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占用空间