Linux学习笔记之grep命令及sed 命令相关选项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习笔记之grep命令及sed 命令相关选项相关的知识,希望对你有一定的参考价值。

#grep  强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

根据模式,搜索文本 ,并将符合模式的文本行显示出来,常与正则表达式相结合使用。

[[email protected] ~]# grep --h
用法: grep [选项]... PATTERN [FILE]...
在每个 FILE 或是标准输入中查找 PATTERN。
默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。
例如: grep -i ‘hello world‘ menu.h main.c

正则表达式选择与解释:
  -E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
  -F, --fixed-strings       PATTERN 是一组由断行符分隔的定长字符串。
  -G, --basic-regexp        PATTERN 是一个基本正则表达式(缩写为 BRE)
  -P, --perl-regexp         PATTERN 是一个 Perl 正则表达式
  -e, --regexp=PATTERN      用 PATTERN 来进行匹配操作
  -f, --file=FILE           从 FILE 中取得 PATTERN
  -i, --ignore-case         忽略大小写

Miscellaneous:
  -v, --invert-match        select non-matching lines;没有匹配的行显示 
 
Output control:
  -n, --line-number         print line number with output lines,输出行显示行号
  -o, --only-matching       show only the part of a line matching PATTERN;只显示被匹配的字符串
  -l, --files-with-matches  print only names of FILEs containing matches
  -c, --count               print only a count of matching lines per FILE
  -T, --initial-tab         make tabs line up (if needed)
  -Z, --null                print 0 byte after FILE name

Context control:
  -B, --before-context=NUM  print NUM lines of leading context,显示前面的NUM行
  -A, --after-context=NUM   print NUM lines of trailing context,显示后面的NUM行
  -C, --context=NUM         print NUM lines of output context,显示前后NUM行
      --colour[=WHEN]       use markers to highlight the matching strings;WHEN is `always‘, `never‘, or `auto‘

正则表达式:Regular Expression ,REGEXP

     Basic REGEXP  :基本

     Extended REGEXP :扩展

    定义:正则表达式是自定义的,linux文本工具(如grep,sed)用来过滤文本的模式模板,linux工具能够在数据流向工具时对数据进行正则表达式模式匹配,数据能匹配模式则会被接受进行下一步处理(如显示、删除、替代等)。正则表达式在shell和linux中的地位非常重要,透过正则表达式强大的字符串处理能力,我们可以从大量的数据中快速检索出仅符合需要的数据进行分析,由此给工作带来极大的便利。

基本正则表达式:

文本统配符:

     [ ]  匹配指定范围内的任意单个字符

    [[:space:]] 所有的空白字符

    [[:punct:]] 所有标点符号

    [[:lower:]]  所有小写字符

    [[:upper:]]  所有大写字符

    [[:alpha:]]  所有大小写字母

    [[:digit:]]  所有数字

    [[:alnum:]]  数字和大小写字

     [^]  匹配指定范围之外的任意单个字符,如[^0-9]或[^[:digit:]]表示数字之外的任意单个字符

元字符:

    .  任意单个字符

    示例 #grep ‘r..t’/etc/passwd

    *    其前面字符匹配任意次数

    .*   匹配任意长度的任意字符

    \? 匹配其前面的字符1次或0次

    \+  匹配前面的字符1次或多次

    \{m\}:表示它前面的字符要出现m次

    \{m,n\}:表示它前面的字符出现至少m次,至多n次

    \{m,\}:表示它前面的字符出现至少m次 

    \{0,n\}:表示它前面的字符出现至多n次

位置锁定:

    ^  :锚定行首 ,此字符后面的任意内容必须出现在行首

    示例:grep ‘^r..t’ /etc/passwd

    $: :锚定行尾,此字符前面的任意内容必须出现在行尾

    示例: grep ‘b$‘ /etc/passwd

    ^$   :空白行

    示例:grep ‘[[:digit:]]‘ /etc/inittab

    \< 或者\b:表示其后的任意字符必须作为单词首部出现

    \> 或者\b : 表示其前面的任意字符必须作为单词的尾部出现

分组或字符串:

     \(\)       \(ab\) 表示ab一个整体

    \1 :表示第一个左括号及与之相对应的右括号之间的内容相匹配

   

扩展正则表达式:

字符匹配

    .  任意单个字符

    [] 匹配指定范围内的任意单个字符

    [^] 匹配指定范围以外的任意单个字符 

次数匹配

    *  其前面字符匹配次数,任意次

    ? 匹配其前面的字符1次或0次

    + 匹配其前面的字符至少一次

    [m,n] 表示其前面的字符至少出现m次,至多出现n次 

锚点字符

    ^ 锚定行首 ,此字符后面的任意内容必须出现在行首

    $  锚定行尾,此字符前面的任意内容必须出现在行尾

    \< 表示其后的任意字符必须作为单词首部出现

    \> 表示其前面的任意字符必须作为单词的尾部出现

分组

    () 例(ab) ab表示为一个分组或字符串

    \1  \2   \3  

或者

    |   :b|a   左边字符或者右边字符 

例:
[[email protected] ~]# grep  --color ‘halt‘ /etc/inittab   #在/etc/inittab 文件中显示包含halt的行,且halt 高亮显示
#   0 - halt (Do NOT set initdefault to this)
[[email protected] ~]# grep -o  ‘bash$‘ /etc/passwd     #在/etc/passwd 文件中只显示匹配的字符 bash
bash
[[email protected] ~]# grep -A2  ‘bash$‘ /etc/passwd     #在/etc/passwd文件中显示匹配包含bash 行的后两行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# grep -B2  ‘bash$‘ /etc/passwd 
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# grep -C2  ‘bash$‘ /etc/passwd     #在/etc/passwd文件中显示匹配包含bash行的前后两行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# grep  ‘^r..t‘ /etc/passwd       #在/etc/passwd文件中显示匹配以r..t 为开头的行
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# grep ‘bash$‘ /etc/passwd        #在/etc/passwd文件中显示匹配以bash 为结尾的行
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# grep ‘\(bin/bash\)$‘ /etc/passwd     #在/etc/passwd文件中显示匹配以字符串/bin/bash为结尾的行
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]#grep -E --color ‘^[[:space:]]+ ‘/boot/grub/grub.conf  #在/boot/grub/grup.conf 文件中高亮显示以1个或多个空白符开始的行  
        root (hd0,2)
        kernel /boot/vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=950d5a28-d573-443b-a02e-ac4db4466897 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-504.el6.x86_64.img

sed :流编辑器  Stream  EDItor 也被称为行编辑器,它一次处理一行内容。 默认不编辑元文件,仅对模式中的空间做处理 。

[[email protected] ~]# sed --h
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

  -n, --quiet, --silent
                 取消自动打印模式空间
  -e 脚本, --expression=脚本
                 添加“脚本”到程序的运行列表
  -f 脚本文件, --file=脚本文件
                 添加“脚本文件”到程序的运行列表
  --posix
                 关闭所有 GNU 扩展
  -r, --regexp-extended
                 在脚本中使用扩展正则表达式

Address :

   1、起始行,结束行  

       $ :最后一行

       $-1 :倒数第二行

例:
[[email protected] ~]# sed ‘1,18d‘ /etc/passwd    表示显示空间删除了/etc/passwd文件的第1到第18行,仅显示最后2行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
[[email protected] ~]# sed ‘3,$d‘ /etc/passwd    表示显示空间删除了/etc/passwd文件的第3到最后行,仅显示前2行 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

   2、/RegExp/   表示匹配正则表达式的行

[[email protected] ~]# sed  ‘/^root/d‘ /etc/passwd  表示显示空间删除以root开头的行
bin:x:1:1:bin:/bin:/sbin/nologin
...
ntp:x:38:38::/etc/ntp:/sbin/nologin
[[email protected] ~]# sed ‘/^$/d‘ /etc/fstab |sed ‘/^#/d‘  表示显示空间删除/etc/fstab文件中空白的行及以#开头的行            
UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
UUID=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
...
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
[[email protected] ~]#

   3、/Pattern1/,/Pattern2/  :第一次被模式1匹配到的行开始,至第一次被模式2匹配到的行结束。 

[[email protected] ~]# sed ‘/^root/,/^v.*/d‘ /etc/passwd  表示显示空间删除/etc/passwd 文件中的以root开头的行到以v开头的行,显示剩余行
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

   4、Linenum :指定的行

[[email protected] ~]# sed ‘10d‘ /etc/fstab | sed ‘/^#/d‘  表示显示空间删除/etc/fstab文件中以UUID开头的行及以#开头的行    

UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
UUID=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
UUID=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

   5、StartLINe +n

       从startline 行开始,向后的n行

[[email protected] ~]# sed ‘/^UUID/,+5d‘ /etc/fstab   表示显示空间删除/etc/fstab文件中空白的行及其后面的5行    

#
# /etc/fstab
# Created by anaconda on Thu Sep  7 18:22:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

 Command:

    \d :删除符合条件的行 ,反斜线 转意

    p :显示符合条件的行

    a\string:  在指定的行后面追加信行 ,内容为string

     \n :  可用于换行

    i\string :在指定的行首添加新行

    r FIEL :将制定的文件的内容添加到符合条件的行处

    w FIEL :将地址指定的文件的内容另存到指定的文件

    s/pattern/string/修饰符 :查找并替换,默认只替换 每行中第一次被匹配到的字符串

         加修饰符:

        g:全局替换

         i:查找是忽略字符大小写

格式:s///   ,s### ,[email protected]@@

    $  :引用匹配中的字符串

   ^$   :代表了空白行

例:
[[email protected] ~]# sed ‘/^$/d‘ /etc/fstab |sed ‘/^#/d‘  表示显示空间删除/etc/fstab文件中空白的行及以#开头的行 ,剩余的显示
UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
UUID=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
UUID=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
UUID=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
[[email protected] ~]# sed ‘/^UUID/a\my‘ /etc/fstab   表示在匹配以UUID开头的行后面追加字符串my
...
UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
my
UUID=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
my
UUID=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
my
UUID=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
my
...
[[email protected] ~]# sed ‘/^UUID/a\my\n\yes‘ /etc/fstab  表示匹配的行尾换行追加yes字符串

#
# /etc/fstab
# Created by anaconda on Thu Sep  7 18:22:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
my
yes
UUID=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
my
yes
UUID=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
my
yes
UUID=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
my
yes
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0
[[email protected] ~]# sed  ‘/^UUID/i\ss‘ /etc/fstab    表示匹配的行首添加新行ss

#
# /etc/fstab
# Created by anaconda on Thu Sep  7 18:22:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
ss
UUID=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
ss
UUID=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
ss
UUID=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
ss
UUID=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
[[email protected] ~]# sed ‘/^root/r /root/a.txt‘ /etc/passwd   将/root/a.txt的内容添加到符合条件的行处
root:x:0:0:root:/root:/bin/bash
#bin/bash
aa
bin:x:1:1:bin:/bin:/sbin/nologin
...                       
[[email protected] ~]# sed ‘s/UUID/abc/gi‘ fstab    查找并替换,替换每行中第一次被匹配到的UUID字符串为abc,全局替换并忽略大小写

#
# /etc/fstab
# Created by anaconda on Thu Sep  7 18:22:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
abc=950d5a28-d573-443b-a02e-ac4db4466897 /                       ext4    defaults        1 1
abc=6f747986-4d4d-4479-9a64-ee659d48125e /home                   ext4    defaults        1 2
abc=6e822436-ba9d-45f2-b222-27fcdab35023 /usr/local              ext4    defaults        1 2
abc=9983fa02-7deb-4603-9a34-ab5a127136f1 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0


本文出自 “Wish_亮” 博客,请务必保留此出处http://itwish.blog.51cto.com/11439802/1966404

以上是关于Linux学习笔记之grep命令及sed 命令相关选项的主要内容,如果未能解决你的问题,请参考以下文章

Linux的命令及三剑客(grep sed awk )

Linux学习计划

Linux命令之grep/sed/awk等行转列

Linux命令之sed批量替换字符串操作

3. linux常用命令及三剑客 grep sed awk 用法

Linux bash 文本处理命令awk,sed,grep 用法