如何使用通配符 sed 路径

如何使用通配符 sed 路径

我的路径包含

/home/user/data/foo/test_foo.gz
/home/user/data/bar/test_bar.gz
/home/user/data/fub/test_fub.gz
and so on...

我正在尝试打印所有 .gz 文件的第三行

zcat /home/user/data/*/test_*.gz | sed -n '3p' > results

但这只显示了第三行test_foo.gz

答案1

是的,因为sed只能看到发送的流zcatcat这些文件的未压缩内容的组合gz

您需要sed在此处为​​每个文件运行一个:

for file in /home/user/data/*/test_*.gz; do
  { zcat | sed '3!d;q'; } < "$file"
done > result

这里使用sed '3!d;q'forsed在第三行之后退出,因此zcat可以在完成解压缩整个文件之前中止。

确保如果{ a | b; } < file无法打开,则a或 都不会b运行。file在 中a < file | b,运行a会被跳过,但不会b。在a file | b(对于那些a可以自己打开文件的命令)中,无论文件是否可以打开,都会启动a和。b

zgrep至少在 Debian 上找到的,你还可以这样做:

GREP=sed zgrep '3!d;q' /home/user/data/*/test_*.gz

zgrep有一个 shell 脚本实际上在其参数上运行(并且除非您使用该选项,否则zcat -f | $GREP会在文件名前面加上 using ,尽管在此处使用with不起作用,因为该选项被传递到并且不支持该选项)。sed-h-hGREP=sed$GREPsed

答案2

您的管道,

zcat /home/user/data/*/test_*.gz | sed -n '3p' > results

将与该模式匹配的所有文件的内容提取到一个流中,然后从中提取第三行。

获取第三行每个文件的,你将不得不循环它们:

for pathname in /home/user/data/*/test_*.gz; do
    zcat "$pathname" | sed -n 3p
done >results

这对每个文件调用一次zcatandsed一次(假设模式与某些内容匹配)。

答案3

使用命令完成find

find path -type f -iname "*.gz" -exec bash -c "zcat {}|sed -n 'p'" \; >>results.txt

相关内容