我有一个 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 操作可能毫无意义,但如果搜索模式变得更复杂,它可能会变得更快。