grep
Global search regular expression and print out the
line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查 , 打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件
grep 正则表达式与扩展正则表达式
正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”
或”的扩展正则表达式元字符 , 正规的 grep 无法识别
加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp
和
grep -E 一样
cp /etc/passwd /mnt ##将/etc/passwd拷贝到/mnt做实验
grep root passwd ##找出含有root的行
grep ^root passwd ###找出以root开头的行
grep root$ passwd ###找出以root结尾的行
grep -i ^root passwd ###找出以root开头的行(忽略大小写)
grep -E "root|ROOT" passwd ###找出含有root的行(包含大小写)
egrep "root|ROOT" passwd ###用egrep就不用加E了
grep -Ev "root|ROOT" passwd ###屏蔽root和ROOT
grep -v -i -E "^root|root$" passwd | grep root ###找出root在中间的行
grep -E "root|ROOT" passwd |grep -i -E -v "^root|root$" ###找出root在中间的行
grep 'r..t' test ###找出rt间有两个字符的
grep 'r...t' test ####找出rt间有三个字符的
grep 'r....t' test ####找出rt间有4个字符的
grep 'rt' test ###找出rt
grep 'r*t' test ###找出r从0到任意字符的行
grep -E 'ro*t' test ###找出o从0到任意字符的行
grep -E 'ro?t' test ####找出o出现0-1 次
grep -E 'ro{1,}t' test ###找出o出现1到任意字符的行
grep -E 'ro{1,3}t' test ###找出o出现1到3次的行
grep -E 'ro{,3}t' test ###找出o出现最多出现3次
grep -E 'ro{3,}t' test ###找出o出现至少出现3次
grep -E 'ro+t' test ###找出o出现1到任意 次
grep -E 'ro{1,}t' test
grep -E 'root' test ###找出有root的
grep -E '(root){2,}' test ####找出root至少出现两次的
grep -E 'r.*t' test ###匹配rt之间任意字符
grep -E 'r....' test ###找出r后有4个字符的
grep -E 'r...' test ###找出r后有3个字符的
grep -E 'r...\>' test ###找出r后只有3个字符的
grep -E '...t' test ###找出t前面有3个字符的
grep -E '\<...t' test ###找出t前面只有3个字符的
ifconfig eth0 | grep -E "inet\>" ###过滤出本机的ip的行
sed
行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空
间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾
sed 对字符的处理(5种模式)
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
(1)p显示模式
sed -n '/^#/p' fstab
sed -n '/^UUID/p' fstab ###显示以UUID开头的行
cat -n fstab | sed -n '2,6p' ###显示第2行到第6行
cat -n fstab | sed -n '2,6!p' ###不显示第2行到6行
cat -n fstab | sed -n -e '2p;6p' ###有多个策略时用-e
sed -n '/0$/p' fstab ###显示以0结尾
sed -n '/0$/!p' fstab ###显示不以0结尾的
(2)d删除模式
cat -n fstab | sed -e '2d;6d' ###删除2行和6行
cat -n fstab | sed -e '2,6d' ###删除第2行到第6行
sed -e '/^#/d' fstab ###删除以#开头的行
sed -e '/^$/d' fstab ###删除最开头的第一行
sed -e '/^$/d;/^#/d' fstab ###删除最开头的第一行和以#开头的行
sed -e '/UUID/d' fstab ###删除含有UUID行
sed -e '/UUID/!d' fstab ###不删除有UUID行
(3)a添加模式
vim westos
sed '/hello/aworld' westos ###添加world到hello后
sed '/hello/aworld\nwestos' westos ###添加world和westos到hello后并换行
(4)插入模式
sed '/hello/iworld\nwestos' westos ###插入world和westos到hello前并换行
cat westos
(5)更改模式
sed '/hello/chello world' westos ###将内容进行替换
sed '/hello/cwestos\nworld' westos ###将内容进行替换并换行
(6)写入模式
cp /etc/passwd .
sed -n '/bash$/p' passwd
sed -n '/bash$/p' passwd > file ###显示passwd中/bash最后一行,并保存到file中
cat file
rm -fr file
sed -n '/bash$/wfile' passwd
cat file
rm -fr file
sed '/hello/wfile' westos
cat file
219 sed '/hello/=' westos ###给hello加上行号
220 sed -e '/hello/=;wfile' westos ###显示hello的行号并写进file中
sed '/hello/=' -i westos ###将结果导入原文件-i,input
cat westos
sed '/hello/=' westos ###给westos内容加上行号
echo `sed '=' westos` ###将行号和内容显示在一行
sed '6r westos' fstab ###将westos内容加到第6行后面
sed -n -e '/^UUID/p' -ne '/^UUID/=' fstab ###将开头是UUID的行加上行号后显示
sed -n -e '/^UUID/p;/^UUID/=' fstab ###将开头是UUID的行加上行号后显示
sed '=' fstab ###加上行号
sed '=' fstab | sed 'N;s/\n/ /g' ###将fstab加行号后,再将换行符全替代成空格
##N,表示换行符
sed -n '$p' fstab ###显示最后一行
sed 'G' fstab ###给每行后面加一空行
####G,表示每行后加入空行
sed '$!G' fstab ###去掉最后一行后加的空行
全文替换
vim passwd
cat passwd
sed 's/nologin/westos/g' passwd ###全文替换
sed '3,5s/nologin/westos/g' passwd ###替换3到5行
sed '/adm/,/sync/s/nologin/westos/g' passwd ####匹配关键字所在行替换
sed -e '/adm/,/sync/s/nologin/westos/g;s/sbin/xbw/g' passwd ###多种策略的替换
vim file ###编辑文件里面写入替换策略
sed -f file passwd ###-f可以执行替换,不会改变原文件内容
cat passwd ###查看passwd文件
sed -f file -i passwd ####加上-i原文件内容会改变
cat passwd
awk 报告生成器
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些
准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式
上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
awk -F ":" '{print $1}' passwd ###截出passwd中的第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd ###先执行BEGIN中的东西在显示后面的
awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd
###找出第一列的并加上行数
awk '/bash$/{print}' passwd ###找出以/bash结尾的行
awk -F ":" '/bash$/{print $1}' passwd ###找出以可以登录的用户
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd
####统计出以/bash结尾的有几行
awk '/^[a-d]/{print}' passwd ###找出以a-d开头的行
awk '/^ro/{print}' passwd ###找出以ro开头的行
awk '/^r/&&/bash$/{print}' passwd ###找出以r开头且以/bash结尾的行
awk '/^r/||/bash$/{print}' passwd ###找出以r开头或者以/bash结尾的行
awk -F ":" '$5~/^a/{print}' passwd ####找出第5列以a开头的行
awk -F ":" '$1~/^r/{print}' passwd ###找出第一列以r开头的行
awk -F ":" '$1!~/^r/{print}' passwd ###找出第一列不是以r开头的行
awk -F ":" '$7!~/bash$/{print}' passwd ###找出不是以/bash结尾的用户
awk -F ":" '{print NR,$0}' passwd ###显示每行行号
useradd -d /mnt/home hello1 ###指定家目录建立用户
useradd -d /mnt/ hello
awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
####找出第6列不是以/home开头且以/bash结尾的用户
awk -F ":" '$6!~/^\/home/&&/bash$/{print NR}' /etc/passwd
###统计出第6列不是以/home开头且以/bash结尾的是哪几行
awk -F ":" 'BEGIN{n=0}$6!~/^\/home/&&/bash$/{n++}END{print n}' /etc/passwd
####统计出第6列不是以/home开头且/bash结尾的有几行
ifconfig eth0 | awk '/inet\>/{print $2}' ##截取出本机的ip
awk 'BEGIN{n=0}{n++}END{print n}' /etc/passwd ###显示/etc/passwd中有多少行