【问题标题】:Using sed to return value after '='在 '=' 之后使用 sed 返回值
【发布时间】:2011-10-20 15:32:10
【问题描述】:

一直在阅读 Unix 中的 sed 命令,我认为它会做我想做的事,只是不确定它的疯狂语法。

基本上,我只想获取文件最后一行中 Count= 之后括号内的值。因此,在该行中会有一个Count=[#],我只希望返回 #。有什么想法吗? sed 是不是最好的选择(听说 awk 可能会做类似的事情)?

【问题讨论】:

  • @KeithThompson 抱歉,已编辑。希望它更清楚
  • Sed 的语法并不比 awk 更疯狂。

标签: unix sed awk


【解决方案1】:

稍微不同的方法:

echo 'Count=[#]' | sed 's/.*\[\(.*\)\].*/\1/'

这匹配[] 之间的文本,并用它替换整行。

【讨论】:

  • 菜鸟问题,但这不会以任何方式更改文件吗?
  • 我写的具体命令不读写任何文件。您可以执行sed '...' input.txt > output.txt 之类的操作来读取一个文件并写入另一个文件。
【解决方案2】:

另一种方法:

sed -n '$ {s/Count=\[\([^]]\+\)\]/\1/;p}' yourfile

-n 不打印,p 除外。

$ 最后一行。

s/search/replace/ 搜索将被替换。

\([^]]\+\) 捕获一次或多次出现的 not ']' ^]

\1 指的是捕获的内容。

p 打印线。

考虑到任何一行都可能出现 Count=[#],我可以看到这是唯一的答案。您声明这仅发生在最后一行:'在文件最后一行中的 Count= 之后。'

【讨论】:

  • 这可以简化为单个 sed 命令; sed -n '$s/Count=\[\([^]]\+\)\]/\1/p' yourfile -- $ 是一个地址,/p 可用作s 命令的标志。
【解决方案3】:
kent$  echo "Count=[#]"|awk -F'[][]' '{print $2}'
#


kent$  echo "Count=[#]"|sed -r 's/.*\[(.*)\].*/\1/'
#

【讨论】:

  • 好吧,grep Count filename.log | tail -1 | awk -F'Count=[][]' '{print $2}' 返回了0],这非常接近......我如何摆脱那个尾随的']'?
  • grep Count filename.log | tail -1的输出是什么
  • 输出的一般结构是2011-10-20 08:43:36.051 TibrvConnectivity Lots of stuff Count=[0]...而且我完全忘记了我也需要获取那个日期和时间(所以上面例子中的命令结果应该是@987654326 @. 我试过... | sed 's/\(.*\)Tib.*/\1/',似乎可以很好地获取日期,但我找不到将两者结合起来的方法
【解决方案4】:

使用 sed,只需使用几个正则表达式即可删除不需要的部分:

sed -e 's/^Count=\[//' -e 's/\]$//' < file.txt

sed 's/^Count=\[//;s/\]$//' < file.txt

第一个表达式将删除Count=[,第二个表达式将删除结尾的]

【讨论】:

  • 我试过sed -e 's/^Count=[//' -e 's/]$//' filename.log | tail -1,它说sed: Function s/^Qcnt=[// cannot be parsed.
  • 你输入的是 ctrl+c 还是字符 ^ 和 C?在这种情况下,您要使用字符,而不是控制序列。
  • 对不起,我对 unix 很陌生,我不确定你的意思
  • @Hershizer33:答案有误。 sed 使用[] 作为特殊字符来指定字符范围(例如,[0-9] 匹配任何数字);你需要用 `` 字符来转义它们。我已经编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2018-10-16
  • 2014-02-19
相关资源
最近更新 更多