我想使用bash脚本从多个文件中grep lines :
。我的目录名为1,2,3,4,5,.... 60.对于一个目录,我会使用像
grep "line : " ./1/file.dat |tail -1
但我想将它用于60个目录。
你能不能帮我解释这个命令。
答案 0 :(得分:1)
而不是grep | tail -1
,使用grep -m 1
在第一场比赛后停止。这更容易扩展到多个文件。
grep -m 1 'line : ' ./*/file.dat
或
grep -m 1 'line : ' ./{1..60}/file.dat
答案 1 :(得分:0)
如果想要在每个文件中最后一次出现line :
:
for file in ./{1..60}/file.dat; do grep "line :" $file | tail -1; done
如果您想在这些文件中所有匹配line :
,请跳过tail
:
grep "line :" ./{1..60}/file.dat
答案 2 :(得分:0)
使用GNU awk而不是grep
:
$ awk '/lines :/{print;nextfile}' {1,60}/file.dat
...lines :...
...etc...
说明:
/lines :/ { # if record in file matches "lines :"
print # output the record
nextfile # skip to next file
} # all good things must come to an end
答案 3 :(得分:0)
从每个目录中的每个file.dat
文件输出 last 匹配的行:
for f in ./t*/file.dat; do tac "$f" | grep -m1 'line : '; done
答案 4 :(得分:0)
您可以将grep
与awk
合并。
grep "line :" ./{1..60}/file.dat | awk -F ":" '
NR==1 {lastfile=$1; lastline=$0; next}
lastfile!=$1 {print lastline}
{lastfile=$1; lastline=$0}
END {print lastline}
'
这是一种反模式,awk非常聪明,可以进行匹配。您可以得到相同的结果:
awk '
fname!=FILENAME { if (last) print fname ":" last; last=""; }
{fname=FILENAME}
/line :/ {last=$0}
' ./{1..60}/file.dat