/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
gawk
라인에 하나만 있다고 가정하고 다음을 수행할 수 있습니다.=
gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt
고쳐 쓰다
내가 질문을 잘못 읽었다는 것을 방금 깨달았습니다. 찾고 있는 줄이 항상 마지막 줄인 줄 알았습니다. frames=
for로 시작하는 마지막 줄을 사용하려면 gawk
다음을 수행하십시오.
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'