Quick unix command to display specific lines in the middle of a file?
尝试调试服务器的问题,我唯一的日志文件是一个20GB的日志文件(没有时间戳!甚至为什么人们使用
使用grep,我找到了一个我想看一下的文件区域,第347340107行。
做的事情除了
1 | head -<$LINENUM + 10> filename | tail -20 |
...需要
更新我完全忘记了grep可以打印匹配的上下文...这很有效。 谢谢!
如果您知道行号,我找到了另外两个解决方案,但没有别的(没有grep可能):
假设你需要20到40行,
1 | sed -n '20,40p;41q' file_name |
要么
1 | awk 'FNR>=20 && FNR<=40' file_name |
1 2 3 4 | # print line number 52 sed -n '52p' # method 1 sed '52!d' # method 2 sed '52q;d' # method 3, efficient on large files |
方法3对大文件有效
显示特定线条的最快方式
用GNU-grep你可以说
1 | grep --context=10 ... |
没有,文件不是行可寻址的。
在文本文件中没有找到行n开头的常量方法。您必须流式传输文件并计算换行符。
使用最简单/最快的工具来完成工作。对我来说,使用
关于什么:
1 | tail -n +347340107 filename | head -n 100 |
我没有测试它,但我认为这样可行。
我更喜欢进入
- 输入50%来转到文件的中途,
- 43210G转到第43210行
-
:43210 做同样的事
和那样的东西。
更好的是:点击v开始编辑(当然是在vim中!),在那个位置。现在,请注意
我首先将文件分成几个较小的文件
1 | $ split --lines=50000 /path/to/large/file /path/to/output/file/prefix |
然后grep生成的文件。
你可以使用
-
显示一行(例如第二行):
1ex +2p -scq file.txt相应的sed语法:
sed -n '2p' file.txt -
线条范围(例如2-5行):
1ex +2,5p -scq file.txtsed语法:
sed -n '2,5p' file.txt -
从给定行到结束(例如文件的第5行到结尾):
1ex +5,p -scq file.txtsed语法:
sed -n '2,$p' file.txt -
多行范围(例如2-4和6-8行):
1ex +2,4p +6,8p -scq file.txtsed语法:
sed -n '2,4p;6,8p' file.txt
可以使用以下测试文件测试上述命令:
1 | seq 1 20 > file.txt |
说明:
-
+ 或-c 后跟命令 - 在读取文件后执行(vi / vim)命令, -
-s - 静音模式,也使用当前终端作为默认输出, -
q 后跟-c 是退出编辑器的命令(添加! 以强行退出,例如-scq! )。
获取
Ubuntu / Debian安装:
1 | $ sudo apt-get install ack-grep |
然后运行:
1 | $ ack --lines=$START-$END filename |
例:
1 | $ ack --lines=10-20 filename |
来自
1 2 3 | --lines=NUM Only print line NUM of each file. Multiple lines can be given with multiple --lines options or as a comma separated list (--lines=3,5,7). --lines=4-7 also works. The lines are always output in ascending order, no matter the order given on the command line. |
sed还需要读取数据以计算行数。
快捷方式可行的唯一方法是在文件中进行上下文/顺序操作。例如,如果前面有固定宽度时间/日期等的日志行。
您可以使用look unix实用程序对特定日期/时间的文件进行二进制搜索
如果你的行号是100来阅读
1 | head -100 filename | tail -1 |
使用
1 | x=`cat -n <file> | grep <match> | awk '{print $1}'` |
在这里,您将获得匹配发生的行号。
现在,您可以使用以下命令打印100行
1 | awk -v var="$x" 'NR>=var && NR<=var+100{print}' <file> |
或者你也可以使用"sed"
1 | sed -n"${x},${x+100}p" <file> |
使用
基于Sklivvz的回答,这是一个可以放在
1 2 3 4 5 6 7 8 9 | function middle() { startidx=$1 len=$2 endidx=$(($startidx+$len)) filename=$3 awk"FNR>=${startidx} && FNR<=${endidx} { print NR" "\$0 }; FNR>${endidx} { print "END HERE"; exit }" $filename } |
要通过
1 | perl -wne 'print if $. == <line#>' <textfile> |
如果你想要一个更强大的方法来显示一系列带有正则表达式的行 - 我不会说为什么grep这样做是个坏主意,它应该是相当明显的 - 这个简单的表达式将向你显示你的范围处理~20GB文本文件时你想要的单通道:
1 | perl -wne 'print if m/<regex1>/ .. m/<regex2>/' <filename> |
(提示:如果你的正则表达式中有
这将打印
它不需要一个向导来看一些调整如何使它更强大。
最后一件事:perl,因为它是一种成熟的语言,有许多隐藏的增强功能,有利于速度和性能。考虑到这一点,它使它成为这种操作的明显选择,因为它最初是为处理大型日志文件,文本,数据库等而开发的。
你可以尝试这个命令:
1 | egrep -n"*" <filename> | egrep"<line number>" |
perl很容易!如果你想从文件中获取第1,3和5行,请说/ etc / passwd:
1 | perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd |
我很惊讶只有另一个答案(由Ramana Reddy提出)建议在输出中添加行号。以下搜索输出所需的行号和颜色。
1 2 3 4 | file=FILE lineno=LINENO wb="107"; bf="30;1"; rb="101"; yb="103" cat -n ${file} | { GREP_COLORS="se=${wb};${bf}:cx=${wb};${bf}:ms=${rb};${bf}:sl=${yb};${bf}" grep --color -C 10"^[[:space:]]\\+${lineno}[[:space:]]"; } |