shell查找某字符串在某文件中出现行数的方法

一、简介

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

快速定位某个字符串在某文件中出现的行数,可以使用 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

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

(0)

相关推荐

  • PowerShell Contains函数查找字符串实例

    本文介绍在PowerShell中使用字符串的Contains函数,来查询一个字符串中是否存在另一个字符串. Contains()函数是从String对象中继承过来的,可以直接用于字符串的查找判断.Contains()函数的返回值是一个布尔值,即True或False,它表示的含义是存在或不存在. 举例如下: "123"中存在1 复制代码 代码如下: PS C:\Users\spaybow> "123".contains("1") True &

  • Shell脚本实现查找字符串中某字符最后出现的位置

    需要对字符串查找其中某个字符最后出现的位置,这个在PHP (strrpos)或者Perl (rindex)里面都有现成函数可用的功能,在Shell里面居然一时想不出个道道来.在论坛上发贴也没人解答(不知道是问题太简单还是真的很高深...). 因为事情紧急等不得,于是求救大学同学.Pacman不愧是个中高手,三两下点醒梦中人: rindex.sh代码: 复制代码 代码如下: #!/bin/bash strToCheck=$1; charToSearch=$2; let pos=`echo "$st

  • PowerShell中查找字符串位置的IndexOf函数使用实例

    本文介绍在PowerShell中使用字符串的IndexOf函数,来查询一个字符串中是否存在另一个字符串,如果存在那么它在什么位置. IndexOf函数是String对象的静态方法,用于查找一个字符串在另一个字符串中的位置.如果查寻字符串在被查询字符串中不存在,则返回值为-1.如果存在,则返回查寻字符串所处的位置,位置是从0开始的. 下面看看例子: 在"123"中不存在"13" 复制代码 代码如下: PS C:\Users\spaybow> "123&

  • PowerShell中使用Like运算符配合通配符查找字符串例子

    本文介绍在PowerShell中使用通配符来查找字符串,和通配符一起使用的是like运算符. 在PowerShell中的通配符是星号(*)和问号(?),这跟DOS系统中是一样的.要使用通配符在字符串中查找,可以使用like运算符.举例如下: "123"是以1开头 复制代码 代码如下: PS C:\Users\splaybow> "123" -like "1*" True "123"是以1开头,3结尾 复制代码 代码如下:

  • linux shell 字符串操作(长度,查找,替换)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

  • PowerShell实现在字符串中查找大写字母

    如果你想找到字符串中的大写字符,你可能会使用正则表达式.亦或者使用你的大写字母列表一个个匹配,当然更灵活的是使用.NET中的 IsUpper()函数. 小编注:.NET是PowerShell的土壤,尽最大可能挖掘出这些framework框架中的函数,是我们伸手党永恒的追求. 下面的例子,会扫描字符串中的每一个字符,然后返回遇到的第一个大写字母的位置: $text = 'here is some text with Uppercase letters' $c = 0 $position = for

  • linux shell字符串内置的常用操作(获取长度、查找、替换)

    之前我们也发过相关的文章.这里呢,推荐大家使用一些内置的函数. 在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时间,因此速度会很的快.如果内置的操作符能够做到的,优先使用内置的. 1 读取字符串值 表达式 含义 ${var} 变量var本来的值 ${var-default} var没声明返回default,但不改变var的值 ${var:-def

  • shell 字符串操作(长度,查找,替换)详解

    复制代码 代码如下: 工作中字符串操作举例 filename='/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg' #下面是使用shell字符串操作 buName1=${filename#*/jobs/} #去除'/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg'前缀得到'CnClickstat/DFSLoader/loader.cfg' buName1=${buName1%%/*} #去除'Cn

  • PowerShell使用正则表达式查找字符串实例

    本文介绍在PowerShell中使用-match运算符加正则表达式,进行字符串的搜索. match运算符,后面加上正则表达式,可以对字符串进行正则匹配查找.正则表达式功能强大,用于查找字符串时方便快捷.所以match运算符是我们经常要用到的一个知识.match查找的结果也是布尔值类型,即True或False,表示匹配成功或匹配失败. 下面举例说明: "123"是以"1"开头 复制代码 代码如下: PS C:\Users\spaybow> "123&q

  • shell查找某字符串在某文件中出现行数的方法

    一.简介 有的时候,我们需要分析日志来排查错误,但是日志文件特别大,打开肯定是很慢的,也是没法接受的,我们需要的是快速定位错误出现的位置,并定向取出错误信息. 快速定位某个字符串在某文件中出现的行数,可以使用 linux中grep命令 默认情况,grep命令只会输出匹配的字符串所在的行,如下: 要想同时输出行号,可以指定参数-n,关于-n参数描述如下: -n, --line-number print line number with output lines 现在,我们已经确定要查询的错误所在行

  • Node.js实现在目录中查找某个字符串及所在文件

    需求如下: 整个目录下大概有40几M,文件无数,由于时间久了, 记不清那个字符串具体在哪个文件,于是.强大,亮瞎双眼的Node.js闪亮登场. windows下安装Node.js和安装普通软件毫无差别,装完后打开Node.js的快捷方式,或者直接cmd,你懂的. 创建findString.js 复制代码 代码如下: var path = require("path"); var fs = require("fs");   var filePath = process

  • python实现递归查找某个路径下所有文件中的中文字符

    本文实例为大家分享了python实现递归查找某个路径下所有文件中的中文字符,供大家参考,具体内容如下 # -*- coding: utf-8 -*- # @ description: # @ author: # @ created: 2018/7/21 import re import sys import os reload(sys) sys.setdefaultencoding("utf8") def translate(str): out = set() line = str.s

  • Python查找文件中包含中文的行方法

    前言 近几天在做多语言版本的时候再次发现,区分各种语言真的是一件比较困难的事情,上一次做中文提取工具的就花了不少时间,这次决定用python试一试,结果写起来发现真是方便不少,自己整理了一下方便以后查找使用. 代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # find the line of containing chinese in files __author__ = 'AlbertS' import re def start_find_

  • Python实现将json文件中向量写入Excel的方法

    本文实例讲述了Python实现将json文件中向量写入Excel的方法.分享给大家供大家参考,具体如下: 有一个需要是将已经向量化的页面的数据中的向量写入Excel中用于展示,工作很简单,这里简单复习一下Excel文件写的工作,试验中使用的json文件内容如下: 复制代码 代码如下: [ {"vector": [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0

  • 在Python文件中指定Python解释器的方法

    以下针对Ubuntu系统,Windows系统没有测试过. Ubuntu中默认就安装有Python 2.x和Python 3.x,默认情况下python命令指的是Python 2.x.因此当将Python脚本设为可执行文件直接在命令行里执行时,系统调用的是Python 2.x的解释器. 如果在直接执行Python脚本(例如在命令行直接输入xxx.py)时,想调用Python 3.x解释器去解释脚本,一种方法是修改符号链接,让python命令指向Python3.这种方法在自己的系统上还行得通,如果脚

  • python修改txt文件中的某一项方法

    在做task中,需要将TXT文本中的某一项注释修改,但是python对txt文本只有写入和读取两种操作. 我采用的方法是: 1.读取txt文件,将每一行数据,加入新建立的list中. 2.在list中修改数据 3.再新建一个txt文件,按行存入数据.记得添加 '/n' 分行 实例: 这里修改里面的数字,修改为: from __future__ import division with open(r'TACoS_test_samples-Copy1.txt','r') as f1: lines =

  • java从文件中读取数据的六种方法

    目录 1.Scanner 2.Files.lines (Java 8) 3.Files.readAllLines(java8) 4.Files.readString(JDK 11) 5.Files.readAllBytes() 6.经典管道流的方式 本文主要介绍了java从文件中读取数据的六种方法,分享给大家,具体如下: Scanner(Java 1.5) 按行读数据及String.Int类型等按分隔符读数据. Files.lines, 返回Stream(Java 8) 流式数据处理,按行读取

  • Python实现从文件中加载数据的方法详解

    前几篇都是手动录入或随机函数产生的数据.实际有许多类型的文件,以及许多方法,用它们从文件中提取数据来图形化. 比如之前python基础(12)介绍打开文件的方式,可直接读取文件中的数据,扩大了我们的数据来源.下面,将展示几种方法. 我们将使用内置的 csv 模块加载CSV文件 CSV文件是一种特殊的文本文件,文件中的数据以逗号作为分隔符,很适合进行数据的解析.先用excle建立如下表格和数据,另存为csv格式文件,放到代码目录下. 包含在Python标准库中自带CSV 模块,我们只需要impor

  • Python输出PowerPoint(ppt)文件中全部文字信息的方法

    本文实例讲述了Python输出PowerPoint(ppt)文件中全部文字信息的方法.分享给大家供大家参考.具体分析如下: 下面的代码依赖于windows com,所以必须在机器上安装PowerPoint才能用,可以将PPT文件中的所有纯文本信息进行输出到指定的文件,非常实用. import win32com from win32com.client import Dispatch, constants ppt = win32com.client.Dispatch('PowerPoint.App

随机推荐