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 第三个 分成列
我有这样一行命令的输出:
[]$ <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 第三个 分成列