如何从日志文件中剪切部分?

如何从日志文件中剪切部分?

我有一个 8 GB 的日志文件(Rails 生产日志)。我需要在一些日期(行)之间剪切它。我可以使用哪个命令来执行此操作?

答案1

就像是

sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less

tee cut-log允许您在屏幕上看到文件中的内容cut-log

编辑:

为了满足 fred.bear 的严格标准,这里有一个 sed 解决方案(尽管可以说 awk 解决方案更漂亮):

b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"

答案2

要打印 FOO 和 BAR 之间的所有内容(包括 FOO 和 BAR),请尝试:

$ sed -n '/FOO/,/BAR/p' file.txt

答案3

这将执行您想要的操作...
显示包括和排除参数日期。

# set Test args
set  2011-02-24  2011-02-26  "junk"

from="$1"
till="$2"
file="$3"

# EITHER ====                              +++++++++  
# Ouptut lines between two parameter dates INCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 >= from) && ($2 <= till) { print $0 ; next }
    ($2 > till) { exit }' "$file"

# OR ========                              ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 > from) && ($2 < till) { print $0 ; next }
    ($2 >= till) { exit }' "$file"

它测试字段 2 中的(排序的)日期...这是测试数据的示例

    98  2011-02-05 xxxx
    99  2011-02-05 xxxx
   100  2011-02-06 xxxx
   101  2011-02-06 xxxx

这是测试数据生成器

答案4

处理这么大的文件总是很困难。

一种前进的方法可能是将此文件拆分为几个小文件,为此,您可以使用 split 命令。

split -d -l 50000 ToBigFile.data file_

即使它被分割,你仍然可以使用该文件,就像使用 bash for 循环一样

for f in `ls file_*`; do cat $f; done;

但是您可以使用反向 grep 来代替 cat 来删除不需要的数据,这与此无关。 (或您需要的改进类型)。

此时,您将只处理许多较小的文件,并且上面提到的其他命令将在许多较小的文件上工作。

完成后,您可以使用第二个 for 循环再次构建新的较小文件。

for f in `ls file_*`; do cat $f >> NewFile.data ; done;

更新 由于我们开始将数据拆分为多个文件,因此硬盘驱动器将进行大量工作,这需要时间。 (在这个问题上显然是5min)。

另一方面,接下来的步骤可能会更快。

因此,这种方法对于简单的 grep、awk、sed 操作可能毫无意义,但如果搜索模式变得更复杂,它可能会变得更快。

相关内容