首页 > 其他分享 > 116、tail+grep命令——2023年3月7日10:01:06

116、tail+grep命令——2023年3月7日10:01:06

时间:2023-03-07 10:12:58浏览次数:42  
标签:10 01 grep log 命令 tail 参数

2023年2月20日14:50:37

1、tail基本命令

tail 命令. 因为查看日志通常从后面最新的日志去看, tail 命令就是从后往前找.

比如下述命令会显示 access.log 的最后 10 行的内容:

tail access.log

2、tail指定行数

默认情况下, tail 只会显示最后的 10 行, 对于一个日志很多的应用来说, 这可能是不够的, 为此我们需要搜索更多的行.

tail 可以结合 -n 参数指定一个行数, 比如下述命令会显示最后的 30 行的日志:

tail -n 30 access.log

注: 如果不太能记住参数, 还可以使用 -n 的完整命令参数 --lines:

 tail --lines 30 access.log

3、grep命令

grep 命令的基本用法是这样的. 假如你有一个文件 index.html, 你想在其中搜索一个关键词 official, 你可以这样用:

grep official index.html

注意, 通常不要直接用 grep 命令去搜索整个日志文件, 因为日志文件通常很大, 而且 grep 也是从开头开始搜索的, 因此可能搜索出一大堆你不感兴趣的历史记录.

不需要单引号

4、带有空格的关键字

如果关键字有多个单词并带有空格, 可以使用 '' 单引号引起来, 例如:

grep 'english version' index.html

5、grep显示上下行

有时, 我们不但要找出关键子所在行, 而且还想显示所在行上下的一些行.

这在查找异常信息时非常常见, 一方面异常栈会打印成非常多行, 另外我们通常需要前前后后都看一下到底发生了什么.

这时可以使用 grep 的 -NUM 参数来实现, 如下:

grep -5 official index.html

或者是使用 -C

grep -C 5 official index.html

它表示, 不但要找出 official 关键字所在行, 还要把所在行前后的 5 行都显示出来.

  • 后接的数字 5 就表示前后 5 行, 如果是 -10 就表示前后 10 行

6、grep显示行号

为了更清晰地呈现, 还可以选择显示行号, 用 -n 参数, 如下:

grep -5 -n official index.html

结果如下图:

可以看到, official 关键字在 21 行, 行头的行号还特别以冒号":" 标出; 此外, 关键行的前 5 行(16~20)和后 5 行(22~26)也一并显示了出来.

如果我们是在跟踪一个异常, 这些上下文的信息可能会提供很多帮助.

7、管道符

如果想在更大范围搜索并显示关键字的上下文, 最终可以这样去写:

tail -n 20 error.log | grep -3 stream

以上命令在最后 20 行中去搜索 stream 关键字并显示关键字所在行及上下各 3 行的内容

综上所述, 从单个命令到复合命令, 再到脚本化和参数化, 其实是用了编程中的抽象这一手法, 这是我们解决重复性以及解决复杂性的一种重要手段.

当一个命令或几个的复合命令比较繁琐时, 我们就用一个脚本文件去做抽象, 保留不变的东西, 把变化的东西参数化, 外部化, 通过这样的方式, 就简化了执行(调用)的过程, 减少了重复.

毕竟, 如果你经常需要查找日志的话, 输入简单的 ./search.sh foo 比反复输入如此之长的一串 tail -n 1000 error.log | grep --color -10 foo 要方便快捷的多.

作为一名程序员, 减少重复是我们的天职, 我们应该是怕重复, 怕麻烦的, 某种意义上, 我们应该是"懒惰"的:

还记得 Perl 语言的发明人 Larry Wall 的话吗: "优秀程序员应该有三大美德:懒惰、急躁和傲慢(laziness, impatience and hubris)"

总结:经常用查询的话,写一个脚本,定义固定参数比较好。

8、脚本编写

自然, 很多时候可能只想传递关键字即可, 当把 tail 的行数和 grep 的上下文的行数也参数化后, 每次调用也要传递它们是不方便的, 当如果把它们写死的话, 有时我们可能又需要适当变化, 这个矛盾怎么解决呢? 答案是利用缺省值和逻辑判断.

如果是常用的语言, 如 java, javascript, 写个这种判断相信对你来说是个再简单不过的事, 对于 bash 这种脚本语言, 最大的问题还是我们不熟悉其语法, 那么这个还是跟之前说的那样, 查查手册, 或搜索下, 过程就省略了, 具体来说, 可以这样:

#!/bin/bash
lineCount=1000
if [ $2 ]; then
	lineCount=$2
fi

contextCount=10
if [ $3 ]; then
	contextCount=$3
fi

cd /usr/local/nginx/logs
tail -n $lineCount error.log | grep --color -$contextCount $1

简单说就是定义两个变量lineCountcontextCount, 分别具有 1000 和 10 两个缺省值, 然后利用 if 判断用户是否输入了第二和第三个参数, 如果有, 就用它们的值取代缺省值, 没有的话就使用缺省值, 这样一来就比较灵活了.

如果只输入了关键字:

./search.sh hi

结果就是这样:

tail -n 1000 error.log | grep --color -10 hi

输入两个参数:

./search.sh hello 300

结果就是这样:

tail -n 300 error.log | grep --color -10 hello

输入三个参数:

./search.sh hey 500 8

结果就是这样:

tail -n 500 error.log | grep --color -8 hey

当然还是有个问题, 当你想只调整第三个参数时, 你还是必须得传入第二个参数, 否则传入的值只会被第二个参数优先获得.

举例:

error日志里,倒数1000里有hello world字符串吗,有的话显示行号,显示上下10行

tail -1000 error.log | grep -C 10 -n 'hello world'

END

2023年2月21日10:19:46

标签:10,01,grep,log,命令,tail,参数
From: https://www.cnblogs.com/oneapple/p/17187074.html

相关文章

  • LeetCode1024 -- 贪心
    1.题目描述这题题意感觉说的不是很清楚,容易让人产生歧义!其实题意很简单,给你一个链表head,你深拷贝它,然后返回即可,注意不能修改原链表/*//DefinitionforaNode.cl......
  • v10 有麒麟安装vsftp配置用户
    1.安装[root@localhost~]#yum-yinstallvsftpd//配置开机启动[root@localhost~]#chkconfigvsftpdon[root@localhost~]#servicevsftpdstatus2.配置//添加......
  • 10_Nginx
    Nginx有什么用反向代理、缓存、负载均衡。功能1:反向代理背景:随着访问流量的不断增加,系统不足以支持时,可以对系统进行横向扩展,即增加服务节点,比如说从1个服务节点,增加的2......
  • ORA-01406
    今天某客户询问ORA-01406报错应该如何处理,查看信息如下,这里提示列被截断这里提示的也很明显,使用一致的字符类型避免被截断[oracle@rds~]$oerrora140601406,00000,......
  • c#随笔记01
    C#语言的特点不允许直接操作内存,去掉了指针操作。彻底的面向对象设计:封装、继承、多态usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingS......
  • 10,docker基础之---Harbor+阿里云+本地镜像仓库
    什么是镜像仓库?存放着很多镜像的仓库。为什么要使用镜像仓库?例如我们之前使用的pull下载mysql镜像的时候下载的镜像就是存放在他人的镜像仓库之上,公司内部部署镜像仓库即可......
  • 构建之法阅读笔记01
        在第一章的学习中,我了解到了软件=程序+软件工程,程序,指的是源程序,也就是一行行代码,软件工程的核心部分是和软件开发活动相关的内容,还有一个推论就是软件企业=软件+商......
  • 2.ubuntu-22.10
    1.开始安装2.选择中文3.键盘布局选择chinese4.更新和其他软件5.安装类型选择默认的”清除整个磁盘“6.时区选择"shanghai"7.设置密码,等待安装8.若提示:Pl......
  • csp201709-2
    题目:计算机软件能力认证考试系统直接对时间进行枚举,本以为会超时,没想到过了,过了就过了、、 #include<bits/stdc++.h>usingnamespacestd;set<int>keep[10105];se......
  • PAT Basic 1009. 说反话
    PATBasic1009.说反话1.题目描述:给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。2.输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的......