grep正则表达式及sort、diff等相关命令

Linux文本处理三剑客:

grep:文本过滤工具(模式:patter)

sed:stream editor 流编辑器,文本编辑工具

awk:linux上的实现gawk,文本报告生成器(格式化文本)

* 正则表达式:Regular Expression,REGEXP,由一类特殊字符及文本字符所编写的模式,其中有些字符其不表达字面意义,而是用于表示控制或者通配的功能;

* 分类: 基本正则表达式:BRE;扩展正则表达式:ERE

* 元字符:\(hello[[:space:]]\+\)\+ 匹配模式

grep :Global search REgular expression and Print out the line.

作用:文本搜索工具,根据用户指定的"模式(过滤条件)" 对目标文件逐行进行匹配检查,打印匹配到的行

模式:由正则表达式的元字符及文本字符所编写的过滤条件
  • 正则表达式引擎:

    grep:支持正则表达式,-E:支持扩展表达式
    egrep:扩展正则表达式,-G支持正则表达式

  • grep [OPTIONS] PATTERN [FILE…]

  • grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

  •    -i:ignorecase 忽略字符大小写
       -o:仅显示匹配的字符的字符
       -v:反向显示不匹配的信息
       -E:支持使用扩展的正则表达式元字符
       -q: --quite 安静不输出信息,通过echo $?获取是否匹配,即执行是否成功
       -A #:输出匹配的后#行数,与-B相反
       -C #:前后指定#行数, -A,-B,-C,上下文之意
  • 基本正则表达式元字符:

    字符匹配
        .:匹配任意单个字符 eg:grep “r..t" /etc/passwd
        []:匹配指定范围内的任意单个字符
        [^]:匹配指定范围外的任意单个字符
        [:lower:],[:upper:],[:digit:],[:alpha:],[:alnum:]
    
    匹配次数:用于要指定其出现次数的字符后面,用于限制其前面字符出现的次数
        *: 匹配其前面的字符任意次:0,1,多次;
         eg:grep "x*y"  abxy,aby,yab,xxxy
        .*:匹配任意长度的任意字符
           eg: grep "r.*" /etc/passwd ,贪吃蛇模式
        \?:匹配其前面的字符出现0,1;即前面的字符可有可无
        \+:匹配其前面的字符至少1次,或多次
        \{m\}:匹配前面的字符m次
        \{m,n\}:匹配前面的字符至少m,至多出现n次
        \{0,n\}:匹配前面的字符至多n
        \{m,\}:匹配前面的字符至少m
    
    位置锚定
        ^: 行首锚定;用于模式的最左侧
        $: 行尾锚定;用于模式的最右侧
          eg:^PATTERN$ 匹配正行
               ^$:空白行;
             ^[[:space:]]*$: 空白或包含空白的字符的行
             单词锚定:非特殊字符组成的 连续字符都称为单词
             \<或者 \b;词首 \>,\b:词尾 \<PATTERN\> 精确锚定单词

  • 位置锚定
        ^: 行首锚定;用于模式的最左侧
        $: 行尾锚定;用于模式的最右侧
          eg:^PATTERN$ 匹配正行
               ^$:空白行;
             ^[[:space:]]*$: 空白或包含空白的字符的行
             单词锚定:非特殊字符组成的 连续字符都称为单词
             \<或者 \b;词首 \>,\b:词尾 \<PATTERN\> 精确锚定单词
  • 练习:

  • 1,显示/etc/passwd文件中不以/bin/bash结束的行

  • ~]#grep -v "/bin/bash" /etc/passwd
  • 2,找出/etc/passwd文件中两位数或者三位数

  • ~]#grep "\\<[0-9]\\{2,3\\}\\>" /etc/passwd ~]#grep "LISTEN*$"   ;以LISTEN结束的行,后面可有可无的字符 ~]#grep -E "\\<[0-9]{2,3}\\>" /etc/passwd ;或者 egrep "\\<[0-9]{2,3}\\>" 这是扩展正则表达式
  • 3,找出”netstat -tan“ 命令结果中以‘LISTEN'后跟0,1,多个空白字符的行

  • ~]#grep "^[[:space:]]\\+"  ;以空格字符为行首,至少出现一次 ~]#grep "LISTEN*$"   ;以LISTEN结束的行,后面可有可无的字符

egrep:扩展正则表达式(grep -E)

    egrep     [OPTIONS] PATTERN [FILE....]
    -i,-o,-v,-q,-A,-B,-C
    -G:支持基本正则表达式
    扩展正则表达式的元字符
    字符匹配:
        .:匹配任意单个字符 eg:grep “r..t" /etc/passwd
        []:匹配指定范围内的任意单个字符
        [^]:匹配指定范围外的任意单个字符
    次数匹配
        *:任意次,0,1,...
        ?:0,或者1次
        +:至少1次
        {m}:m次
        {m,n}:至少m次,至多n次
        {0,n}:至少0次,至多n次
        {m,}:,至少m次

    位置锚定
        ^:行首锚定
        $:行尾锚定
        \<,\b, 词首锚定
        \>,\b ,词尾锚定
    分组及引用
        ():分组,括号中匹配到的内容被表达式引擎记录于内部的变量中:后向引用,\1,\2,\3,...
        a|b:a或B
         (c|C)at:cat或Cat

练习:

1,找出/proc/meminfo文件中,所有在大写或者小写s开头的行,至少两种方式:

~]#grep -E "^(s|S)"  /proc/meminfo ~]#grep "^[sS]" /proc/meminfo ~]#grep -i "^s" /proc/meminfo ; -i不区分大小写 ~]#grep "^\\(s\\|S\\)" /proc/meminfo ; 基本正则表达式必须加转移字符

2,显示当前系统上root、centos或testbash用户的相关信息

~]#grep -E "^(root|centos|testbash)\\>" /etc/passwd ; 直接锚定词尾 ~]#grep "^(root\\|centos\\|testbash)\\>" /etc/passwd ; 直接锚定词尾

3,找出/etc/rc.d/init.d/functions文件中某单词后面 跟一个小括号的行

~]#grep -E "[_[:alnum:]]+\\(\\)" /etc/rc.d/init.d/functions ; 找出所有的函数了,[_[:alnum:]]+\\(\\) 这就是函数名的匹配模式元字符

4,使用echo命令输出一绝对路径,使用egrep取出基名

~]# echo /etc/rc.d/init.d/  | egrep -o "[^/]+/?$" ; 相当于basename

5,找出ifconfig命令结果之中1-255之间的数值

~]#egrep --color=auto "\\<[1-2][0-9][0-5]\\>"

6,找出ifconfig命令结果中的ip地址

~]#egrep "[1-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}" ;ip地址,第一个字节应该不能为0吧

7,添加用户bash,testbash,basher以及nologin(shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行

~]#egrep "^([[:alpha:]]+\\>).*\\1$" /etc/passwd ; 这个只是利用字母表的表,下个这个更为准确 ~]#egrep "^([^:]+\\>).*\\1$"  /etc/passwd  ; 利用这个文件分隔符的特性,就行分割单词

fgrep:不支持正则表达式元字符:主要遇到大文件时,这个命令性能会更好

wc 命令

-l :行数
-w:单词数
-c:字节数

cut命令

-d:指定符号为分割符-d: 以冒号分隔符,只能单个分隔符
-f:需要显示的域 (-f#;-f#-#;-f#,#)
~]# cut -d':' -f1,6-7 /etc/passwd

sort命令 ;默认是第一个字符进行排序

-t CHAR: 指定分隔符
-k #:用于排序比较的字段
-n:基于数值大小排序
-r: 逆序排序
-f:忽略字符大小写
-u: 重复的行只保留一份
~]#    sort -t':' -k 3 -n /etc/passwd

uniq命令,报告或去掉重复的行

-u:只显示没有重复的行
-c:显示每行重复的数
-d:仅显示重复过的行
~]# cut -d':' -f 7 /etc/passwd | sort -u | wc -l  ; 统计有多少shell ~]# cut -d':' -f 7 /etc/passwd | sort | uniq -c  ; 统计各行重复的次数

注意:uniq是结合sort使用的,直接使用uniq,如果两个相同行不在一起,则是不能排除的,所以只有排序过后才能用uniq去掉重复行(也相当于-u参数)

diff命令:逐行比较文件的

-u 使用unfiled 机制,即系那是要修改行的上下文,

patch 打补丁

可以结合diff命令使用,新旧文件的不同之处统计统计出来

~]# diff passwd passwd.new  >passwd.patch  ; 对比两个文件的不同之处放入补丁包文件 ~]# patch -i passwd.patch passwd  ; 向旧文件打入补丁包文件内容 ~]# patch -R -i passwd.patch passwd ; 撤回已打入的补丁内容

1,取出eth0中的ip地址

ifconfig eth0 | grep -Ei "inet addr" | cut -d':' -f 2 | cut -d' ' -f1

还有join,tr,col,paste expand等相关命令

testInet

原创文章,作者:不忘初衷,如若转载,请注明出处:http://www.178linux.com/65245

(0)
不忘初衷不忘初衷
上一篇 2016-12-29 17:22
下一篇 2016-12-29 18:09

相关推荐

  • linux多网卡绑定

    为了增加网络牢固性,linux服务器通过多块网卡来实现网卡冗余或链路聚合、负载均衡的技术。网卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6常用的有三种mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援…

    系统运维 2016-06-23
  • ​源码编译安装LNMP

    源码编译安装LNMP 环境:CentOS6.6 IP: 172.16.10.10/16 GW:172.16.0.2 主机名称: lnmp.test.net 一、常规设置: 网卡: 临时 ifconfig eth0 172.16.10.10/16 up 永久 [root@www ~]# vim /etc/sysconfig/network-scripts/if…

    Linux干货 2016-11-14
  • 计划任务

    任务计划Linux任务计划、周期性任务执行未来的某时间点执行一次任务:atbatch:系统自行选择空闲时间去执行此处指定的任务周期性运行某任务:cron     at任务at命令:at [option] TIME常用选项:-V 显示版本信息:-l: 列出指定队列中等待运行的作业;相当于atq-d: 删除指定的作业;相当于atrm-c: 查…

    Linux干货 2017-08-28
  • 第二周作业

    1. Linux上文件管理类命令总结及示例 文件管理命令主要由查看类命令和管理类命令组成 查看类命令 cat:显示文本 cat [OPTION]… [FILE].. tac:倒序查看文件内容 tac [OPTION]… [FILE].. head:显示文件前几行内容 head [OPTION]… [FILE].. -n#:指定获取前#行,也可直接使用-# -…

    Linux干货 2016-12-10
  • 网络基础知识

    网络基础知识: 网络设备 TCP/IP协议 ARP协议 网络设备:     HUB集线器: 工作在物理层,没有学习能力,作用在于把各种节点汇聚在以它为中心的节点上,同时也有传输数据的作用,由于没有学习能力,只能以广播的形式将数据发送给与它相连的所有节点。 特点:共享带宽,半双工     &…

    Linux干货 2016-09-02
  • Linux上实现rsyslog+mysql+loganalyz进行日志收集

    在我们的运维工作中,常常会对系统上的日志进行收集,手动管理少量的几台服务器的日志收集没有太大难度,但是企业当中批量的管理成千上万台服务器的时候,这时候想一台台的收集日志未免太浪费时间了,这时候我们需要一个批量管理日志的系统来解决这一难题,今天我给大家带来的使用 1、syslog介绍       &n…

    Linux干货 2016-10-24