我有一个包含以下行的文本文件:
[...]
GFX Clocks and Power:
800 MHz (MCLK)
26 MHz (SCLK)
[...]
我想提取800 MHz
它的一部分(该值不是恒定的),所以我想删除\t
并(MCLK)
使用sed
.
这是我现在的命令:
$ cat ~/test.txt | grep "(MCLK)" | xargs -0 sed -i -e $'s/\t//g' -e 's/\(MCLK\)//g'
运行时,返回:
sed: can't read 800 MHz (MCLK)
: No such file or directory
这似乎不是一个换行错误,也不是关于\t
成为非标准字符的问题sed
(cf.简单的 sed 选项卡替换神秘地失败) 应该被修复。
可能是什么问题?
答案1
如果你有pgrep
:
grep -Po '[0-9]+ [KMGT]?Hz(?= \(MCLK\))' test.txt
答案2
xargs
获取其输入并将其转换为给定命令的参数。grep
返回您感兴趣的行,并将xargs
该行作为参数添加到sed
需要文件名的命令中。你xargs
根本不需要。
您可以告诉sed
只对与模式匹配的行进行操作:
sed -i~ -e '/(MCLK)/{s/\t//g' -e 's/(MCLK)//g}' ~/test.txt
答案3
尝试这个,
sed '/(MCLK)/ s/(MCLK)//g;s/\t//' test.txt
800 MHz
/(MCLK)/
将搜索关键字。s/(MCLK)//g
将删除(MCLK)
.s/\t//
将删除选项卡。
您可以使用-i
选项进行内联编辑。
对于您编辑的问题,
awk -F '[$\t ]' '/(MCLK)/ {print $2" "$3}' test.txt
800 MHz
答案4
尝试使用以下命令,效果也很好
命令
sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"
输出
sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"
800 MHz