shell脚本之grep的使用方法

  笔者最近在使用shell脚本中处理字符串,因此使用了大量shell脚本中的四剑客(awk,grep,sed,cut)而其中使用最多的两种方法就是grep和awk,因此想总结整理一下。

  一、grep的意义

  二、grep的基本用法

  三、awk的意义

  四、awk的基本用法

  五、实例说明两者怎么用

  一、grep的意义

    首先,grep是用来处理行数据的基本命令集,简单来说它的使用意义就在于当你想要找到某个文件中的某个字符串以及它相关联的信息时(比如说行数),那么你就需要这个命令了。

  二、grep的基本用法

     grep使用的格式为   grep  [参数]   "模式"   文件

   (1)grep的作用域

     grep的作用域主要是由最后一个参数文件所决定的,换句话说,如果决定在某个文件中查找字符串,那么直接在后面书写某个文件即可,而如果在某个文件夹,那么要做两件事:1、首先需要在参数中加 -r(表示递归的意思)。2、在文件参数上加上文件夹。

     例如:假设一个文件夹git_reverse目录中包含一个文件,文件夹中含有文件1.txt,而1.txt中包含字符串66666666,如果现在要搜索字符串6666666666,那么有以下两种方法:

     1、grep  NULL   "66666666666" (单引号,双引号,不加引号)   1.txt

        2、grep    -r       "66666666666"(单引号,双引号,不加引号) git_reverse

    无论是哪一种都可以。     

   (2)grep的参数

     grep的参数是grep当中的最大难点,也是不太容易记得部分,我觉得在这里我们可以按照由大到小的顺序来进行记忆:

      1、首先从最大的进行记忆:是否查找改行前后的n行。此时可以使用

        -A(after):表示匹配之后的第n行。

        -B(before):表示匹配之前的第n行。

        -C(context):表示匹配之前和之后的第n行。

      2、接着我们要判断是不是需要行数:

        -n(num):表示判断当前是否有行数

      3、接着我们就要判断字符串本身了。同样由大到小进行排列:

        1、首先我们要判断它是否忽略大小写:

          -i(ignore):忽略大小写

        2、接着我们判断是否只匹配该字符串和不匹配相关的字符串

          -o(output):判断只输出这个

          -v(verse):判断不输出这个

        3、接着我们可以设置其是否高亮:

          --color:颜色

      (3)grep的模式匹配

      好了,搞清楚这些我们就应该开始研究grep里面仅剩的一个参数“模式”的问题了。其实模式的话主要可以分成两个部分:第一个的话就是固定模式,换句话说就是你知道相应的字符串,比如我们要搜索某个文件中的6666666这个字符串,那么我们就直接用grep “66666666” 文件就可以了。

      看到这里你可能会有一个疑问,那就是grep的引号和shell脚本中用法是一样的吗?好的,这里我们要说一下grep中引号的用法。首先,我们要知道grep中单引号,双引号和不加引号三种方法。首先要明确的一点是:这三种方式在一定程度上是可以转换使用的。比如上面我搜索的666666666,无论是单引号和双引号都是可以的。因此我们这里主要谈一下三者的区别。

      首先说一下加引号(单引号和双引号都算上)和不加引号的区别。这个主要应用于空格上面。换句话说如果你搜索的文本中包含空格,那么你就必须加引号。(这个应该也比较好理解,因为grep命令是默认过滤空格的)。

      接着我们说一下单引号和双引号。这个的用法和shell脚本基本相同,也就是说如果我们定义一个a=“var”,那么我们要搜索这个var这个字符串,就必须用“$a”,而如果我们使用了‘$a‘,那么我们搜索出来的结果就是$a,这是因为$符本身就是系统保留字,系统是识别这个字的,但是如果换一个字,比如^,这个字符系统是不认的,那么它单引号和双引号是一样的。

      好了,回到之前的话题,如果我们我知道我们具体要搜索哪个字符,只是知道一个搜索字符的大致范围该怎么办呢?那么这里我们就要用到正则表达式了。

    正则表达式可以分成两个部分,一个是确定字符的位置关系,还有一个是确定字符的出现数量和范围。

    (1)位置关系

      确定正则表达式的位置关系有两个,一个是^(表示以.......开头),用法为t^,表示匹配以t为开头的用法。另一个是以$(表示以.........结尾),用法为t$(正则表达式都是匹配前面的)。

    (2)数量关系

      这里主要说两个字符,一个是*,它表示之前的字符从0次到无数次,比如比如,zo*可以匹配z或者zoo,另外还有一个就是.,他就是占位符,他会显示本身可以匹配任何字符。例如:zo.可以匹配zoe,zor等等。另外还有一个符号就是{,可以用来匹配出现的个数,比如o{2,}就可以表示o出现两次的问题。

    (3)匹配范围

      这里主要介绍一下[符号,它表示里面的内容范围,比如如果我们要匹配字母,可以这样[a-z],同理如果我们要匹配数字,可以写[0-9]等等。

   (4)和其他命令的合用

      grep可以和很多命令合用,只要你想抓取数据信息,你就可以用grep。比如cat XXX | grep XXX。

   今天就先写道这,下次写awk命令。

    

原文地址:https://www.cnblogs.com/songyuchen/p/12146165.html

时间: 2024-10-24 14:48:08

shell脚本之grep的使用方法的相关文章

学习Linux shell脚本中连接字符串的方法

这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"=" echo $value2 把要添加的字符串变量添加{},并且需要把$放到外面. 这样输出的结果是:home=,也就是说连接成功. 又如代码如下: [[email protected] sh]# var1=http://www.3lian.com/etc/ [[email protected] s

Linux中执行shell脚本命令的4种方法总结

bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

shell脚本中grep时关于变量带双引号的小问题

今天在写一个shell脚本的时候,有一个操作是使用grep命令在一个文件中搜索指定内容.指定内容存放在文件中,使用一个变量去获取文件中内容,再传到grep命令中去. 这段代码如下: for target in `cat content.txt`do     grep $target test.txt >>result.txtdone content.txt文本中的内容为: "域\[2\]" "域\[3\]" "域\[4\]" 因为使用

qt中调用shell脚本并监控返回的方法

在QT中经常要调用外部命令或者是执行shell脚本,并且要对执行结果进行分析. QProcess runShellProcess =new QProcess(this); //调用过程输出的监控 connect(runShellProcess, SIGNAL(readyRead()), this, SLOT(readProcess())); connect(runShellProcess, SIGNAL(finished(int)), this, SLOT(finishedProcess()))

Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令

Grep命令 1.基本正则表达式实例--查找特定字符 这里我们就以存放本机所有用户的/etc/passwd文件做实例 Demo1 [[email protected] ~]# grep -n "root" /etc/passwd //-n表示显示行号 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 2.基本正则表达式实例--查找集合字符 有重复的字符时,可使用"

shell脚本的三种执行方法

1.bash 脚本或者sh 脚本 2../脚本 3.. 脚本或者source 脚本 说明.或者source是内建命令 第一种方法是脚本没有执行权限的时候使用 第二种方法是当前路径下执行脚本但必须有可以行权限 第三种方法在当前进程运行即父进程下运行,而前两种方法在父进程下创建子进程运行脚本 举个小例子表示区别: 因为前两种执行脚本方法是在当前父进程下创建子进程执行shel脚本,定义的内容不会返回到父进程,而第三种方法是在父进程下直接执行脚本,可以返回定义的内容. vim /etc/init.d/c

Shell脚本8种字符串截取方法总结

Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符即删除 http://结果是 :www.aaa.com/123.htm 2. ## 号截取,删除左边字符,保留右边字符. echo ${var##*/} ##*/ 表示从左边开始删除最后(最右边)一个

shell脚本字符串截取的多种方法

前四种方法是删除某些字符,后四种方法是保留某些字符 1.# 号截取,删除左边字符,保留右边字符 var="hello world" echo ${var#*l} 结果: lo world 其中 var 是变量名,# 号是运算符,*l 表示从左边开始删除第一个 l及左边的所有字符即删除 hel 2.## 号截取,删除左边字符,保留右边字符. var="hello world" echo ${var##*l} 结果: d ##*l 表示从左边开始删除最后(最右边)一个l

shell脚本去重的几种方法

测试文件 [[email protected] ~]# cat >test jason jason jason fffff 按 Ctr + D保存 1.sort -u [[email protected] ~]# sort -u test fffff jason 2.uniq [[email protected] ~]# uniq test jason fffff jason 由此可见,uniq需要先排序后才能去重 3.sort.管道和uniq结合运用 去除重复并保留一份重复的数据 [[emai