0

如何从以下输出中获取 @ 字符的计数。我使用了tr命令并提取了?我很想知道最好的方法是什么?我的意思是做同样事情的其他方法。

{running_device,[test@01,test@02]},

我的解决方案是:

echo '{running_device,[test@01,test@02]},' | tr ',' '\n' | grep '@' | wc -l
4

3 回答 3

2

我认为使用起来更简单:

echo '{running_device,[test@01,test@02]},' | tr -cd @ | wc -c

这为我产生了 2 个(在 Mac OS X 10.7.5 上测试)。-c选项表示“tr补充”(指定字符集)并-d表示“删除”,以便删除每个非@字符,并wc计算提供的内容(没有换行符,因此行数为 0,但字符数为 2 )。

于 2013-01-17T04:09:50.430 回答
1

使用 GNU Grep 避免字符翻译

这是另一种我个人觉得更直观的方法:使用 grep 仅提取匹配的字符,然后计算 grep 的输出行数。例如:

echo '{running_device,[test@01,test@02]},'   |
     fgrep --fixed-strings --only-matching @ |
     wc -l

结果2

于 2013-01-17T08:28:46.947 回答
1

你的方法没有错。以下是其他几种方法:

echo $(echo {running_device,[test@01,test@02]}, |awk -F"@" '{print NF - 1}')

或者

echo $((`echo {running_device,[test@01,test@02]} | sed 's+[^@]++g' | wc -c` - 1 ))

我唯一担心的是,如果您在循环中运行此命令(例如,大文件中的每一行运行一次)。如果是这种情况,那么执行时间可能是一个问题,因为将 shell 实用程序串在一起会导致启动进程的开销,这可能会很慢。如果是这种情况,那么我建议编写一个纯 awk 版本来处理整个文件。

于 2013-01-17T04:05:25.140 回答