一、简介

有的时候,我们需要分析日志来排查错误,但是日志文件特别大,打开肯定是很慢的,也是没法接受的,我们需要的是快速定位错误出现的位置,并定向取出错误信息。

快速定位某个字符串在某文件中出现的行数,可以使用 linux中grep命令

默认情况,grep命令只会输出匹配的字符串所在的行,如下:

要想同时输出行号,可以指定参数-n,关于-n参数描述如下:

-n, --line-number print line number with output lines

现在,我们已经确定要查询的错误所在行数,就可以通过 tail和head或是sed命令输出特定的行

1、利用tail和head来输出特定的行

通过tail –help ,我们可以看到tail 默认显示最后10行,通过 -n参数可以指定从第n行数开始显示,或是显示最后n行,如下:

-n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

也就是说:

tail -n 5 f.txt //显示f.txt最后5行

tail -n +5 f.txt //从第5行开始,显示f.txt

通过head –help ,我们可以看到head默认显示最前10行,通过 -n参数可以指定从倒数第n行开始,显示前面的所有,或是显示最前面的n行

-n, --lines=[-]K print the first K lines instead of the first 10; with the leading `-', print all but the last

也就是说:

head -n 5 f.txt //显示f.txt最前面5行

tail -n -5 f.txt //从倒数第5行开始,显示前面的所有内容

比如,在上面我们定位到了8786830行,那么,我们就可以利用tail和head,查其附近的内容(即错误前20行,后10行内容),如下:

tail -n +8786810 err.log |head -n 30

2、利用sed来输出特定的行

通过sed来查看指定的行,就比较简单,格式如下:

sed -n "n1,n2p" f.txt //查看f.txt n1行到n2行之间的内容

比如,在上面我们定位到了8786830行,那么,我们就可以利用sed,查其附近的内容(即错误前20行,后10行内容),如下:

sed -n "8786810,8786840p" err.log

补充:shell 字符串出现的行数

1 查询字符串所在的行号

grep -n "xxx" str.txt # -n 打印字符 “xxx” 在文件 “str.txt” 所在的行数前缀

示例:

str.txt

xxx

yyy

zzz

xxx

输入查找命令:grep  -n  "xxx"   str.txt

结果如下:

1:xxx

4:xxx

行号1,4在前,匹配字符串“xxx”在后,两者之间用冒号 “:” 隔开

2 查找字符串首次匹配的行号

grep -n "xxx" str.txt | head -1

结果如下:

1:xxx

同理,查找最后一次匹配的行号

grep -n "xxx" str.txt | tail -1

结果如下:

4:xxx

查找字符串第二次匹配的行号

grep -n "xxx" str.txt | head -2 | tail -1 # 先取出前两行,然后取最后一行

结果如下:

4:xxx

3 提取字符串所在的行号

grep -n "xxx" str.txt | cut -d ":" -f 1

先查询字符串 “xxx” 所在的全部行号,然后利用 cut 命令分割“:”字符,提取第一个字段,即行号

结果如下:

1

4

提取首次匹配的行号

grep -n "xxx" str.txt | head -1 | cut -d ":" -f 1

结果如下:

1

4 比较两次字符串行号变化幅度

两个文件内容: str.txt 和 str2.txt

str.txt

xxx

yyy

zzz

xxx

str2.txt

yyy

xxx

www

zzz

比较行号脚本

catline.sh

#!/bin/bash

rm -rf ret.txt

total=`wc -l $1 | awk '{print $1}'`

echo "total = $total"

num=1

while read line

do

echo $line

ret=`grep -n $line $2 | head -1`

echo $ret

if [ -z $ret ]; then

num2=$total

echo "null num2 = $total"

else

num2=`echo $ret | cut -d ":" -f 1`

echo "num2 = $num2"

fi

echo $num

change=`expr $num2 - $num`

echo "$num2 - $num = $change"

num=`expr $num + 1`

echo "$line=$change" >> ret.txt

done < $1

cat ret.txt

执行脚本命令: ./catline.sh    str2.txt   str.txt

运行结果如下:

total = 4

yyy

2:yyy

num2 = 2

1

2 - 1 = 1

xxx

1:xxx

num2 = 1

2

1 - 2 = -1

www

null num2 = 4

3

4 - 3 = 1

zzz

3:zzz

num2 = 3

4

3 - 4 = -1

yyy=1

xxx=-1

www=1

zzz=-1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

shell截取文件行数_shell查找某字符串在某文件中出现行数的方法相关推荐

  1. 解决IE提示“是要保存此文件,还是联机查找程序来打开此文件”

    在登录论坛,或者点击插件总是出现"是要保存此文件,还是联机查找程序来打开此文件" 然后照网络上的"这是动态链接库文件受损,重新注册即可,方法如下:在Windows&quo ...

  2. linux中vim如何查找字符串,[ubuntu] 在vim中查找指定字符串和指定文件

    推荐文章 更新源的方法 提前保存一下原来源 sudo cp sources.list sources.list.bak 换源命令: sudo gedit /etc/apt/sources.list 或 ...

  3. linux查找特定日期之后的文件,Linux Find命令查找指定时间范围内的文件的例子

    例如查找`2013-08-08`到`2013-09-01`号之间的文件,使用如下命令即可: 复制代码 代码如下: find /log/ -name 'production.log-2013*' -ne ...

  4. python返回文件行号_用python比较两个文件中内容的不同之处, 并输出行号和内容....

    '''cmpfile.py - 比对两个文件, 如果有不同之处, 打印内容和行号''' import os class cmpFile: def __init__(self, file1, file2 ...

  5. linux 指定范围内查找文件,Linux Find命令查找指定时间范围内的文件的例子

    例如查找`2013-08-08`到`2013-09-01`号之间的文件,使用如下命令即可: 复制代码 代码如下: find /log/ -name 'production.log-2013*' -ne ...

  6. linux查找某时间段文件夹,shell查找指定时间段内的文件

    #!/bin/bash #20170905 输入参数格式 echo "显示"$1"的备份文件" date_0=$1 date_1=`expr $date_0 + ...

  7. linux查找、搜索字符或文件

    Linux下查找.搜索相关 1.vim中查找 (1).规则 /pattern<Enter> :向下查找pattern匹配字符串 ?pattern<Enter>:向上查找patt ...

  8. php创建压缩文件 保存路径,通过php生成zip压缩文件,支持文件和压缩包路径查找...

    /* * new creatZip($_dir,$_zipName); *@ _dir是被压缩的文件夹名称,可使用路径,例 'a'或者'a/test.txt'或者'test.txt' *@ _zipN ...

  9. Linux常用命令--文件(夹)查找之find命令

    Linux系统用得越久,就会发现这真的是一个很优秀的系统,各种方便各种实用各种高效率. 晚饭前写一下find命令的笔记. 其实这篇笔记,也是看到一篇外文博客,写得不错,自己拿来练一练,然后才顺便写篇笔 ...

最新文章

  1. 一种视觉惯性+激光传感器的SLAM系统
  2. zepto打造一款移动端划屏插件
  3. C Programming Language
  4. matlab没有找到图形用户界面,MATLAB中不能设计图形用户界面。
  5. 永久把linux系统chrome的user agent 改成win10系统的
  6. 统计list里面相同元素个数_Array篇easy难度之求相同元素个数
  7. chromium关闭更新_你的Win10系统20H2了吗此乃Win10年度最靠谱的更新还有Win10优化大师助阵...
  8. kali linux 桌面消失_Kali Linux添加桌面快捷方式
  9. tp框架 中的时间 查询范围
  10. GridBagLayout用法
  11. Vscode Element-ui 提示插件
  12. 【律联云知产课堂】商标注册需要什么条件?
  13. DBCP连接池配置优化分析
  14. 高级Java程序员技术栈
  15. 在网站页面标题显示小图片
  16. 深圳中学招聘太激烈,不是名校博士别想挤破头进去!
  17. stream、lamda、optional
  18. 惠普触控板使用指南_Windows10触控板的正确使用方法
  19. linux运行python脚本_将Python脚本文件包装成可执行文件
  20. Spring Cloud Ribbon 全解 (4) - 基本组件实现源码(2)

热门文章

  1. 漫谈Hadoop的思想之源:Google
  2. 什么是Google产品类别?谷歌购物广告商家中心Feed介绍系列
  3. 我的世界服务器最新npc获得,我的世界1.8Citizens2——NPC插件
  4. 逆向入门之计次软件的破解
  5. 腾讯云Linux命令,腾讯云Linux云服务器常用命令(一)
  6. Niagara控制点说明
  7. ubuntu20.04上openvino安装及环境配置
  8. 全手动连接Filter Graph
  9. Liferay新注册用户缺省页面的研究
  10. 史蒂芬柯维经典之作《第三选择》听后感和思维导图