(BASH)如何在命令中删除默认的'newline'运算符

时间:2013-07-29 13:17:39

标签: linux shell terminal newline output

我有一个命令:

find /etc -type f \( ! -perm /o=w \) -exec /usr/bin/ls -hastl '{}' \; -exec /usr/bin/md5sum '{}' \; > somefile.log

并且此命令创建了这样的打印输出(我需要没有断行):

...
4.0K -rw-r--r--. 1 root root 332 Oct 23  2012 /etc/xinetd.d/rsync
fd32314f3157aaf15712e6da7758060d  /etc/xinetd.d/rsync
....

问题:我必须添加到此命令中以删除新行操作以获得此类结果:

(...) is '-rw-r--r--. 1 root root 332 Oct 23  2012'

...
4.0K (...) /etc/xinetd.d/rsync >> fd32314f3157aaf15712e6da7758060d  /etc/xinetd.d/rsync
...

3 个答案:

答案 0 :(得分:1)

这样的命令怎么样?
echo "$(ls -hastl '{}') >> $(md5sum '{}')"

答案 1 :(得分:1)

两个连接每对相邻的行,只需将输出传输到awk 'NR%2{line=$0;next}{print line sep $0}' sep=" >> ",根据需要调整sep

<强>附录:

在回应原作者的评论时,我将解释这个解决方案的一些细节:

awk以记录方式处理输入,没有逐行的其他选项。 (内部)变量NR存储当前记录的编号。 %是模数运算符,因此NR%2的奇数行数为1,偶数行的0{...}1对要执行的命令(所谓的“操作”)进行分组。由于0被视为“true”而$0为“false”,因此仅对奇数行执行第一个操作。此操作包含两个命令:首先,整行(line)存储在变量next中,然后处理{记录(不考虑任何其他操作)。对于偶数行,不执行此操作,因此考虑第二个操作。由于在line执行操作之前没有表达式:存储的(即先前的)sep与名为$0的变量和当前行(sep)连接在一起。打印结果字符串(并在最后由一个换行符自动附加)。 awk的值作为参数传递给awk,以便在不弄乱脚本的情况下轻松调整它。由于|在没有其他参数的情况下读取标准输入和输出,您只需将查找的输出(awk)管道传输到find ... -exec ... -exec ... | awk ... > ...({{1}})

答案 2 :(得分:0)

恕我直言你只能用exec执行一个命令。一个可能的解决方案可能是你执行“sh -c”,这样你就可以使用管道和类似的东西了:

最后有一个换行符:

find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec /usr/bin/md5sum '{}' \;

没有任何换行符:

find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec sh -c "/usr/bin/md5sum '{}'| tr -d '\n' " \;