如何从以下输出中获取@字符的计数。我用tr
命令并提取了?我很想知道最好的方法是什么?我指的是做同样事情的其他方式。
{running_device,[test@01,test@02]},
我的解决方案是:
echo '{running_device,[test@01,test@02]},' | tr ',' '\n' | grep '@' | wc -l
答案 0 :(得分:2)
我认为使用起来更简单:
echo '{running_device,[test@01,test@02]},' | tr -cd @ | wc -c
这对我来说是2(在Mac OS X 10.7.5上测试)。 -c
的{{1}}选项表示“补充”(指定字符集),tr
表示“删除”,因此删除每个非-d
字符, @
计算所提供的内容(没有换行符,因此行数为0,但字符数为2)。
答案 1 :(得分: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版本来处理整个文件。
答案 2 :(得分:1)
这是另一种方法,我个人觉得更直观:用grep提取匹配的字符,然后计算grep的输出行。例如:
echo '{running_device,[test@01,test@02]},' |
fgrep --fixed-strings --only-matching @ |
wc -l
结果为2
。