脚本grep"一条线"来自名为1,2,3,...... 60的倍数文件

时间:2017-09-09 09:03:00

标签: bash grep

我想使用bash脚本从多个文件中grep lines :。我的目录名为1,2,3,4,5,.... 60.对于一个目录,我会使用像

这样的命令
grep "line : " ./1/file.dat |tail -1

但我想将它用于60个目录。

你能不能帮我解释这个命令。

5 个答案:

答案 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)

您可以将grepawk合并。

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