Linux 文件集的第一行/最后一行从最旧到最新排序



我正在尝试获取目录中一组文件的第一行和最后一行。

我有一组.log文件。希望能够获取第一行和最后一行(每个文件的顶部/底部没有空格/间隙)。

我想先从最旧的文件中抓取第一行和最后一行,然后继续重复,直到它到达最新的文件(这将通过修改时间完成),并将所有这些文件的结果放入一个文件中

例如,下面是一组文件,我希望在每个文件输出之前有一行,以便我知道哪一行属于哪个日志文件。已按顺序手动输入日志文件,但宁愿脚本自动选择最旧-最新的。

echo "S26" >> RunTimes.txt ; sed -n -e '1p;$p' S26.log >> RunTimes.txt ;
echo "S27" >> RunTimes.txt ; sed -n -e '1p;$p' S27.log >> RunTimes.txt ;
echo "S28" >> RunTimes.txt ; sed -n -e '1p;$p' S28.log >> RunTimes.txt ;
echo "S29" >> RunTimes.txt ; sed -n -e '1p;$p' S29.log >> RunTimes.txt ;
echo "S30" >> RunTimes.txt ; sed -n -e '1p;$p' S30.log >> RunTimes.txt ;
echo "S31" >> RunTimes.txt ; sed -n -e '1p;$p' S31.log >> RunTimes.txt ;
echo "S32" >> RunTimes.txt ; sed -n -e '1p;$p' S32.log >> RunTimes.txt ;
echo "S33" >> RunTimes.txt ; sed -n -e '1p;$p' S33.log >> RunTimes.txt ;

必须有一种更有效的方法,任何帮助都非常感谢。

谢谢

EDIT

感谢@JorgeBellon在我尝试转换时提醒

sed -n '1p' to '1p;$p'

我收到 -bash:>>运行时 0 美元.txt:找不到命令

这是下面的完整查询:

ls -t | xargs -n1 bash -c 'echo $0 >> RunTimes.txt; sed -n "1p;$p" $0 >> RunTimes.txt'

不确定是否是因为使用 bash 不喜欢它的格式

?作为解决方法,我尝试使用

head -n1 && tail -n1

希望得到第一行和最后一行但没有成功。

如果我使用双引号,所以"1p;$p"与"1p;$p"相对,查询将运行,但只返回每个日志的第一行。

问候

这可能对你有用(GNU sed,tac和ls):

sed -ns '1p;$p' $(ls -t | tac)

sed 命令行选项-s允许 sed 命令中的行号地址在将多个文件用作输入时分别寻址每个文件。

输入文件集使用当前目录中按反向时间修改顺序排序的文件名称。

结果是目录中所有文件的第一行和最后一行的单个输出流,从最旧到最年轻。

要获取文件名,请使用:

sed -ns '1F;1p;$p' $(ls -t | tac)

最简单但同时也是错误的方法是解析ls -tr1的输出,这将输出按日期排序的文件列表。但是,当涉及有趣的文件名时,这是错误的前进方式(从不解析LS)

健壮的解决方案是使用 GNUfind和 GNUsort创建一个包含修改时间的文件名排序列表:

$ find -type f -printf "%T@ %p" | sort -nz

这将创建一个以 NULL 分隔的字符串。现在可以通过以下方式使用简单循环进行处理:

$ while IFS= read -rd"" line; do 
file="${line#* }"
# do magic with file
command "$file"
done < <(find -type f -printf "%T@ %p" | sort -rnz)

这个答案是基于详细的 BashFAQ#003

该循环也可以仅替换为一条管道线,如下所示:

$ find -type f -printf "%T@ %p" | sort -nz | sed 's/(^|x0)[0-9.]* /1/g' | xargs -0 -n1 command 

要按时间戳对文件进行排序,您可以使用ls -t.如果你想要反向排序ls -rt.

对于给定文件,您可以使用sed -n '1p;$p'获取该文件的第一行和最后一行。

您可以使用xargs将每个文件以ls形式馈送到sed

ls -t | xargs -n1 sed -n '1p;$p'

您需要-n1参数传递给 xargs,以便sed一次获取一个文件。否则,第一行和最后一行将用于ls显示的所有文件。

如果你想在内容之前附加文件名,你需要一些更精细的东西,比如使用另一个 shell 并存储来自xargs的参数:

ls -t | xargs -n1 bash -c 'echo $0 >> RunTimes.txt; sed -n "1p;$p" $0 >> RunTimes.txt'

你可以得到一些更简单的东西awk.

... | bash -c 'awk "BEGIN{print "$0"}NR==1{print}END{print}" $0'

如果结果文件已创建并且您想跳过它,只需过滤输入以查找xargs

ls -t | grep -v RunTimes.txt | xargs ...

或者,如果您还想跳过目录,递归到子目录等,您可以使用find(不按日期排序),然后将其提供给ls

find . -type f -not -name RunTimes.txt | xargs ls -t | xargs ...

最新更新