Unix 为什么sed只显示管道中的一条线
我在一个目录下有几个txt文件,我想看到每个文件的第一行 所以我用Unix 为什么sed只显示管道中的一条线,unix,sed,Unix,Sed,我在一个目录下有几个txt文件,我想看到每个文件的第一行 所以我用 ls *txt | xargs sed -n '1p' 但是,它只返回第一个文件的一行 怎么了 注:我知道我可以使用head,但我要问的是为什么sed不起作用使用参数-t到xargs来查看发生了什么: ls *txt | xargs -t sed -n '1p' 您将看到sed的运行方式如下: sed -n '1p' foo.txt bar.txt gar.txt 由于sed只支持一个输入文件,它将打印输入文件的第一行 文
ls *txt | xargs sed -n '1p'
但是,它只返回第一个文件的一行
怎么了
注:我知道我可以使用
head
,但我要问的是为什么sed
不起作用使用参数-t到xargs来查看发生了什么:
ls *txt | xargs -t sed -n '1p'
您将看到sed的运行方式如下:
sed -n '1p' foo.txt bar.txt gar.txt
由于sed只支持一个输入文件,它将打印输入文件的第一行
文件foo.txt并退出
xargs假设您希望同时传递输入文件列表
要让它一次通过一个,需要使用-L NUM选项,
它告诉xargs从ls命令一次传递一行。
[注意:如果任何文件名中有空白,您将遇到其他问题]
ls *txt | xargs -L 1 -t sed -n '1p'
你会看到:
sed -n '1p' foo.txt
sed -n '1p' bar.txt
sed -n '1p' gar.txt
在unix中,有许多方法可以完成任何任务;其他途径包括:
(如果使用/bin/csh或/bin/tcsh):
如果使用/bin/sh或/bin/ksh,则:
for files in *txt;
do
echo -n $files :
sed -n '1p' $files
done
也考虑使用程序查找;它允许您限定要查看的文件类型,并可以递归检查子目录:
`find . -type f -a -name "*txt" -print -a -exec sed -n '1p' {} \;`
首先,
ls
和xargs
在这里没有用处。请阅读:。要获得适用于各种文件名的更可靠的命令形式,请使用:
sed -n '1p' *.txt
其次,sed
将其所有输入文件视为一个流。所以,上面所说的并不是你想要的。改用head
(如您所说):
要抑制head
打印的详细标题并使输出更像sed 1p
,请使用-q
选项:
head -qn1 *.txt
处理许多文件
如果您有许多.txt
文件,根据系统配置,“许多”可能意味着数万个这样的文件,那么需要另一种方法<代码>查找很有用:
find . -maxdepth 1 -name '*.txt' -exec head -n1 {} +
这可能适用于您(GNU-sed):
这将打印每个文件的第一行,即删除每个文件的第一行以外的所有行。@hek2mgl此外,鉴于OP的目标似乎是学习新的工具,您对awk的担忧是什么?如果效率很重要,那么
gawk'FNR==1{print;nextfile;}'*.txt
。我对awk
没有任何顾虑。但是head
只是一个简单的方法(imo)。我只是觉得用head
来表达它的意图要干净得多awk
有很多有用的领域,让我们保留一个好的head
:)谢谢你,约翰1024<代码>-q真的很方便!引用您的变量,sed
确实支持多个文件,但是(除非-i
)正如John所说,它将所有文件都视为一个流,因此1p
是第一个文件的第一行。有很多很好的答案。但我最终决定接受你的。因为你解释了更多关于管道和xargs的细节。谢谢。或者sed-sn'1p'*.txt
+1用于查找-s
标志:这是OP需要的。很棒的-s
选项!非常感谢。
head -qn1 *.txt
find . -maxdepth 1 -name '*.txt' -exec head -n1 {} +
sed -s '1!d' file1 file2 file...