我一直试图将命令输出到这样的文件:
echo `who | cut -d' ' -f1 | sort | uniq` > users.txt
但users.txt
的内容在一行上。
但是,如果我只是执行这样的命令:
who | cut -d' ' -f1 | sort | uniq
输出在多行上。
如果我使用echo输出如下命令:
echo `who | cut -d' ' -f1 | sort | uniq`
我在1行输出了输出。
这里发生了什么?如何将此命令的输出写入具有多行的文件?
非常感谢任何帮助。
感谢一些评论,我意识到我不需要回声,我可以这样输出:
who | cut -d' ' -f1 | sort | uniq > users.txt
答案 0 :(得分:5)
实际上,echo
可以在多行字符串上正常工作,如果您实际通过防止发生单词分割来提供多行字符串。你可以通过将命令替换括在双引号中来阻止分词而不是扩展。
这将有效(尽管它无用冗长):
echo "`who | cut -d' ' -f1 | sort | uniq`" > users.txt
当然,这里正确的解决方案是避免命令替换(反引号,相当于封闭在$()
内),如另一个答案中所建议的那样,但是在很多情况下使用引用命令替换(即将参数传递给echo
以外的命令是有用的。
答案 1 :(得分:3)
发生这种情况的原因是命令的结果正在通过bash处理的单词拆分阶段传递。由IFS
中的任何字符分隔的所有部分将被分隔为不同的单词,因此您最终会将每个名称作为echo
的单个参数结束。
如上所述,如果您只是希望命令的输出进入文件,echo
通常会妨碍,并且没有必要。您可以将任何命令的输出重定向到文件,而不仅仅是echo
,这样您就可以重新定向管道中最后一个命令的输出,如
who | cut -d' ' -f1 | sort | uniq > users.txt
答案 2 :(得分:1)
假设您只是为了帮助使用uniq选项,awk将是一个更好的选择:
who | awk '!_[$1]++{print $1}' > users.txt