linux中cat怎么看最后几行

结论:直接用tail-n更高效。

cat filename|tail -n5 是方法。
tail -n5 filename 更快,省去cat。
大文件用tail -n5 filename,不用cat。
日志监控用tail -f /var/log/syslog。
显示1 000~2 000行用cat filename|head -n2 000|tail -n+1 000。
你自己掂量。

我和Linux那些事(33)----find命令和管道符命令之间的矛盾

你这问题问得,我琢磨琢磨。

find 命令这玩意儿,我是真常用。
前年我在上海搞项目,服务器上文件堆得跟小山似的,得找某个旧日志。
用 find /data/logs -name "access_.log" -mtime -3 0 就搞定了,找了一堆近三十天修改过的日志文件,那叫一个方便。
后来想把文件名带 "error" 的挑出来看,寻思着用管道 "| grep 'error'",结果你猜怎么着?一堆乱七八糟的输出,根本看不懂。
当时我就纳闷了,咋 find 这命令一单独用就正常,跟别的命令一搭就出毛病呢?
这主要是因为 find 输出的不是标准输出,而是文件名列表。
它每次找到一个文件,就输出那个文件名,后面跟个换行符。
这就跟 ls -l 输出文件详细信息一行一行不一样。
你用管道符,是期望命令1 输出一整块数据,比如 ls -al 输出所有文件信息,然后 more 接着看。
但 find 每次只给一行,more 看着看着就没了,肯定乱。
我在深圳帮朋友调试过一次,他用了 find . -name ".py" | grep "def" 结果卡死,就是这原因,grep 每次只看到 "def" 在一行里,找不到,就一直等,等成了石猴。

所以你说的 find 不能直接接管道符,这我认。
但也不是完全不能用。
你用 -exec 或者 -ok 就行。
前年我在北京,得把所有 .tmp 文件删了,但又怕删错,就用 find /tmp -name ".tmp" -ok rm {} \;。
这个 -ok 它会问你每个文件是不是要删,我一次删了五十多个,全给我逐个点了点头,才删的。
费事是费事,总比误删系统文件强。
还有 -exec,更霸道,直接执行命令,得写成 'command {}' 这种格式,不能写 alias 的,我试过一次用别名,直接报错,说找不到 command,气得我。
那会儿在杭州,想给所有 python 文件加个注释,试了 find . -name ".py" -exec echo " Added by script" >> {} \;,结果 alias 搞了个,立马就错了。

至于你问的为啥 find 不能接管道符,这属于底层设计吧,find 的输出模型跟 ls 不一样。
怎么克服矛盾?主要就是用 -exec 或 -ok。
为啥 -exec 后面不能接别名?因为 {} 代表的是 find 找到的文件名,系统解析命令的时候,别名是在你登录时就加载进 shell 的环境里了,但执行 -exec 的时候,它看的是那个 'command {}' 这个字符串本身,没机会去查你登录时定义的别名,所以得写全称。
我在广州搞自动化脚本的时候踩过这个坑,差点因为别名没写对导致命令执行错误。

你问的好,下次见!