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 命令相关选项的主要内容,如果未能解决你的问题,请参考以下文章