Linux 如何防止grep打印尾随换行符?

Linux 如何防止grep打印尾随换行符?,linux,grep,newline,Linux,Grep,Newline,我正在使用grep生成将由另一个程序解析的输出 但是,该程序只希望输出为数字或零字节 现在grep在输出后输出一个换行符。我已经选中了-Z选项,但它似乎不起作用,因为我正在使用grep进行计数(-c) 我正在执行sh,而不是bash。因此,将其嵌套到echo-n“$(grep-c模式)中也不起作用 如何摆脱尾随的换行符?您可以通过管道将其传递到tr并将\n转换为\0字符: tr '\n' '\0' 用于删除字符串中的字符: $ grep -c ' ' /etc/passwd | tr -d '

我正在使用
grep
生成将由另一个程序解析的输出

但是,该程序只希望输出为数字或零字节

现在
grep
在输出后输出一个换行符。我已经选中了
-Z
选项,但它似乎不起作用,因为我正在使用grep进行计数(
-c

我正在执行
sh
,而不是
bash
。因此,将其嵌套到
echo-n“$(grep-c模式)
中也不起作用


如何摆脱尾随的换行符?

您可以通过管道将其传递到
tr
并将
\n
转换为
\0
字符:

tr '\n' '\0'
用于删除字符串中的字符:

$ grep -c ' ' /etc/passwd | tr -d '\n'
69$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639                                     69
$ 

我知道这很古老,tr也很有效,但我偶然发现了这个问题,并注意到OP说: 我是用sh执行的,不是bash。因此,将其嵌套到echo-n“$(grep-c模式)”中也不起作用

这不是grep或sh,而是echo的使用方式。对于未来的访问者来说,这不起作用的唯一原因是被替换的命令周围有双引号。事实上,即使使用sh,下面的代码也可以使用

echo -n $(grep -c pattern)
示例:

$ ls /dev/sd? #example of formatted output
/dev/sda  /dev/sdc  /dev/sde  /dev/sdg  /dev/sdi  /dev/sdk
/dev/sdb  /dev/sdd  /dev/sdf  /dev/sdh  /dev/sdj

$ echo $(ls /dev/sd?) #without -n, appends \n only at the end
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

$ echo -n $(ls /dev/sd?) #with -n, does not append the \n, but still strips the line breaks from the string
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

$ echo -n "$(ls /dev/sd?)" #output when double quotes are used
/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
/dev/sdi
/dev/sdj
/dev/sdk

不使用tr时,gdb显示
4\nj\000\000
,使用tr时,它显示
4\346j\000\000
作为从命令行返回的值。4是我想要的已计数的数字。您确定
grep
会在数字后生成这些字符吗?