使用sed搜索所有文件的前3次和后3次

在目录的所有文件中搜索字符串的前3名和后3名出现并将结果输出到文件的最佳方法是什么?

我目前正在用2条命令执行此操作。但是有更好的方法吗?

grep string path-to-file | head -3 > out.log
grep string path-to-file | tail -3 >> out.log
leo1988tanghui 回答:使用sed搜索所有文件的前3次和后3次

这可以在单个awk调用中完成,例如:

awk -v n=3 '
FNR == 1 && NR != 1 {
    i = ((c - n) >= n ? c - n : n) + 1 
    for (; i <= c; i++)
        print m[i]   
    c = 0 
    delete m
}
/pattern to match/ {
    c++
    if (c <= n)
        print
    else {
        delete m[c - n]
        m[c] = $0
    }
}
END {
    i = ((c - n) >= n ? c - n : n) + 1 
    for (; i <= c; i++)
        print m[i]
}' *
,

如果您仍然感兴趣:

try except

想法是:

  1. 忽略所有不包含PATTERN模式的行。
  2. 将所有包含PATTERN的行保存在保留空间中
  3. 读取末尾的保留空间并在第一组中存储前3行,在第二组中存储后3行

我现在无法访问计算机,稍后我将对其进行检查并在必要时进行修复

,

这可能对您有用(GNU sed):

sed -nE '/PATTERN/H;$!d;x;s/^((\n[^\n]*){3}).*((\n[^\n]*){3})$/\1\3/;s/.//p' file

聚集在保留空间中和文件末尾包含PATTERN的行,交换到保留空间,删除前三行和后三行之间的任何行,删除引入的换行符,如果成功则打印

本文链接:https://www.f2er.com/3135276.html

大家都在问