我在一个目录中有/home/files/
一些文件具有相同的扩展名.txt
。
例如
1.txt
2.txt
3.txt
4.txt
5.txt
test.txt
这些文件的数据格式都相同,但数据不同。所有这些文件中至少包含以下行
frames=[number here]
该行在文件中出现多次,因此我需要获取frames=
文件中最后出现的值。
正如我所说,我想从目录中与扩展名 .txt 匹配的所有上述文件中获取该行(不需要递归)。
有没有单个 bash 命令可以做到这一点?
编辑
预期输出:
1.txt=5000
2.txt=123
3.txt=3452
4.txt=111
5.txt=958
test.txt=1231
答案1
与find
+ grep
:
find . -name '*.txt' -exec sh -c 'grep -HPo "frames=\K.*" "$0" | tail -n1' {} \;
并以类似的方式使用 shell for
Loop + :grep
for file in *.txt; do grep -HPo 'frames=\K.*' "$file" | tail -n1; done
答案2
使用and 假设线路上gawk
只有一个,你可以这样做:=
gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt
更新
刚刚意识到我误读了这个问题,我认为您要查找的行始终是最后一行。要使用以frames=
,开头的最后一行for gawk
do:
gawk -F= '/^frames=/ { frames=$2 } ENDFILE { print FILENAME"="frames }' *.txt
或者与任何awk
:
for file in *.txt; do
awk -F= '/^frames=/ { frames=$2 } END { print FILENAME"="frames }' "$file"
done
答案3
你可以这样做awk
awk -F= '/^frame/{line=FILENAME "=" $2}NR!=1 && FNR==1{print line}END{print line}' *.txt
或者用sed
(GNU版本4.2.2以上)
sed -sn '/^frame/{s///;h};${F;x;p}' *.txt | sed 'N;s/\n//'
答案4
和pax
(可能也是大多数tar
)和tr
GNU sed
:
pax -w ./*txt |
tr -s \\0 |
sed -nz '/txt$/h
/\n*.*frames\(=[0-9]*\).*\n/!d
H;x;s//\1/p'