2016-08-05 63 views
4

我有这样的命令输出的行:击:如何使用前修剪空白切割

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

我试图拔出12345的第一步 - 由冒号分隔 - 正常工作

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

试图区分这是棘手的。我如何修剪空白,以便cut -d ' ' -f1返回“12345”而不是空白?

回答

4

管你的命令的awk,打印第3列,一个空间和第4列这样

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

这导致:

12345 KB 

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

如果你想要裸号码。

+0

我建议用''替换'''',因为'awk'有一个默认的'OFS',它的值是单个空间。现有的命令没有错,只是有一些不必要的东西在里面。例如'awk'{print $ 3“'$ 4}'和'awk'{print $ 3,$ 4}''在默认的'OFS'的情况下会导致相同的输出。 –

+1

@PS。你当然是对的。非常感谢提示。我在我的帖子中进行了修改。 –

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 
3

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

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

12345 
  • /Memory Limit/将使这一只打印一行用Memory Limit文字
  • $(NF-1)会让你输入last-1 th字段。
+1

推测''输出超过含有 “内存限制” 的一个行。使awk选择想要的行而不是单独使用'grep'并不难,但你需要做一个或另一个。 –

+0

是的,在这种情况下:' | awk'/ Memory/{print $(NF-1)}''应该可以工作 – anubhava

0

awk也许是最适合这个任务,但这里是一个非正统的方式

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

回顾后匹配的标签,只输出匹配,使用xargs的,吃起来的空间

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

0

tr帮助这里。

$ echo "Memory Limit:   12345 KB" | tr -s " " | cut -d " " -f3 
12345 
  • tr -s " " - 挤所有空格放入一个
  • cut -d " " -f3 - 分裂成列由空间和选择第三