繁体   English   中英

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

[英](BASH)How to remove default 'newline' operator in command

我有一个命令:

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
...

这样的命令怎么样

echo "$(ls -hastl '{}') >> $(md5sum '{}')"

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

附录:

为了回应原始作者的评论,我将解释此解决方案的一些细节:

awk记录处理输入,而没有逐行的其他选项。 (内部)变量NR存储当前记录的编号。 %是模数运算符,因此NR%2对于奇数行号求值为1对于偶数行数求值为0 {...}将要执行的命令(所谓的“动作”)分组。 由于1被认为是“ true”而0被认为是“ false”,因此仅对奇数行号执行第一个操作。 该动作由两个命令组成:首先,将整行( $0 )存储在变量line ,然后处理next line记录(不考虑任何其他动作)。 对于偶数行,不执行此操作,因此考虑第二个操作。 由于在执行{之前没有表达式,所以操作:存储的(即前一个) line与名为sep的变量和当前行( $0 )串联。 结果字符串将被打印(并在末尾自动添加一个新行)。 sep的值作为参数传递给awk ,以使其易于调整而不会弄乱脚本。 由于awk无需进一步的参数即可读取标准输入和输出,因此您可以将发现的输出通过管道( | )传递给awkfind ... -exec ... -exec ... | awk ... > ...

恕我直言,您只能使用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' " \;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM