初学Linux 三剑客(grep,sed,awk)

本文主要是一些实际的操作,记录了我自己在初步学习中敲的代码

                                                                1.grep


查看包含root的行:
# grep  "root" /etc/passwd  

查看不包含root的行:(-v表示开启反选)
# grep  -v "root" /etc/passwd  

列出以m开头和m结尾的行:(要知道^和$的含义,不能写错跟m的位置)
# grep "^m" /etc/passwd
# grep "m$" /etc/passwd

匹配非空行并显示出行号:("^$"就是表示开头和结尾中间没有内容的行也就是空行.)
# grep -vn "^$" /etc/passwd

grep在linux中还有egrep衍生版,两者功能基本类似,我这里不展开讲.

                                                                2.sed

sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
sed在处理时一次只读取文件的一行并对这一行进行处理,并且sed将处理后的数据只会显示在屏幕上,并不会对原文件进行修改,所以说sed是一个行编辑器

# cat /etc/passwd > passwd.txt (我们copy一份做实验)

可以看到 sed的动作像上图里的p是可以放到""范围之外的

查询第一行与最后一行:(^p是不合法的字符,我也不知道具体原理,但就是不行,这里就必须是1p)
# sed -n '1p;$p' passwd.txt
查询文件中所有内容:
# sed -n '1,$p' passwd.txt

注意转义字符的使用:有一些字符有特别的含义,在纯文本中是不能直接使用的,如果想要在纯文本中使用的话必须在这些特殊字符前面加上转义符号\进行转义,特殊符号包含:

.*^$\+?|[]{}()

也可以试试查找带有\的行,也是一样的,我们需要加上\转义字符

cat -n passwd.txt | sed -n '1,3p;5.10p'

这段代码是把txt文件的1-3行和5-10行显示出来,看到这行代码出现了两次n,这是为什么呢?

让我先把第一个n去除:

可以看到,第一个n是给passwd.txt进行排列的,可是后面不是已经有-n了吗?,好吧其实是sed的-n是安静模式,就是剔除重复筛选的,这里就要了解到sed的机制了

我们展开来讲:

如图所示.sed "n;p"就是输出偶数行的意思,那可能你又有问题了 ,不对啊,你不是说sed中-n是安静模式吗?这是不一样的,-n和里面的n不一样,我直接百度说结论:

首先我们要明白sed有两种空间:一个是活动的“模式空间(patternspace)”,另一个是起辅助作用的“保持空间(holdspace)这2个空间

sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式空间被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

n  读取下一行到模式空间

N  追加下一行到模式空间

p  打印当前模式空间

P  打印当前模式空间的第一part

n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出).

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符.
然后,就是sed循环执行的原理了,

第一轮执行:

1进入模式空间,执行(n;p),n读入下一行也就是2进入模式空间,原先的1被输出(这是没有被处理过的会被-n过滤),p输出n传过来的2,第一轮输出1,2

第二轮执行:

把的“ 3 ”传给 sed ,(关键)sed 的缓冲区里面现在有“ 2 ”’,然后现在又读入了新的“ 3 ”,输出“ 2 ”,所以现在 sed 的处理缓冲区就有数据“ 3 ”,有了数据“ 3 ”之后 sed 便执行单引号里的“ n;p ”命令

n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了,其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 4 ”,那原来的“ 3 ”怎么办呢(关键),输出“ 3 ,”然后命令还没结束!4就被传给了p,p输出4,那么第二轮输出2,3,4

如果你调用了安静模式,那么就会只输出偶数.

只查询sshd相关的行:
# sed -n '/sshd/p' passwd.txt
查询以nologin结尾的行:
# sed -n '/nologin$/p' passwd.txt
查询从111行开始到abc行中间的行:            //匹配第一个结果即停止
# sed -n '/111/,/abc/p' passwd.txt
查询只包含root和张三的行:
# sed -n '/root/p;/zhangsan/p' passwd.txt
查询时在文本中的所有行后都加入一行空行:
# sed 'G' passwd.txt
查询文本内容的空行再让每行内容再隔1空行显示:
# sed '/^$/d;G' passwd.txt     //删除文本中的空行并将其他内容隔一行空行显示
查询时让每行内容再隔2行显示:
# sed '/^$/d;G;G' passwd.txt
在查询到的abc后面插入一行空行
#  sed '/abc/G' passwd.txt
在匹配abc的前面插入一空行:
# sed '/abc/{x;p;x;}' passwd.txt
同时在前面后面插入一空行:
# sed '/abc/{x;p;x;G;}' passwd.txt

为每行内容加入行号:
# sed = passwd.txt | sed 'N;s/\n/ /'

N上面已经介绍过了,把两行看作一行,这里就是把sed = passwd.txt把行数后面的换行删掉

为每行内容加入行号及.
# sed = passwd.txt | sed 'N;s/\n/\./'

增加
行级增加内容******
以行号指定插入行内容
添加信息到第一行:
# sed '1i00,root,level9' passwd.txt        1表示在第几行操作,i表示在第几行的前面操作
在文件第三行之后添加信息:
# sed '3a00,root,level9' passwd.txt        3表示在第几行操作,a表示在第几行的后面操作
在文件末尾添加一行新内容
# sed '$aabc' passwd.txt
同时添加两行内容呢?
# sed '$auseradd zhangsan\nuseradd lisi' /etc/profile


以关键字插入行内容
在匹配行的下一行添加一行数字内容,/a表示在下一行添加内容:
# sed '/sshd/a123456' passwd.txt
在匹配行的上一行添加一行数字内容,/i表示在上一行添加内容:
# sed '/sshd/i123456' passwd.txt
在有zhangsan行的前面添加###### 后面添加######信息:
-e 同一行执行多条命令
# sed -e '/zhangsan/i######' -e  '/zhangsan/a######' passwd.txt

的1

在关键字为末尾的匹配行的末尾增加新内容/aaa:
# sed 's/nologin$/&\aa/g' passwd.txt     //&表示匹配的关键字,\a为转义

特殊字符在全符号中使用要加转义符号\

 

以下命令和上面命令区别?
# sed 's/nologin/&\/aaa/' passwd.txt

(下面是在后面加/aaa,上面只加a)

在有包含root的行首加入字符aaa:(知道s交换的格式就能轻松看懂,前面的root就是筛选空间,如果是管道用的话就一般是$1,s/A/B/就是标准的s格式)
# sed '/root/s/^/&aaa/' passwd.txt
# sed '/root/s/^/aaa&/' passwd.txt
# sed '/root/s/^/aaa/' passwd.txt
# sed '/root/s/root/aaa&/' passwd.txt

在有包含root的行尾加入字符.:
# sed -e '/root/s/$/&./' passwd.txt
# sed -e '/root/s/$/./' passwd.txt
在有包含root的行首加入字符aaa并在以bash结尾的行加入内容.:
# sed -e '/root/s/^/&aaa/' -e 's/bash$/&./' passwd.txt
# sed -e '/root/s/^/&aaa/;s/root$/&./' passwd.txt

通过替换来获取网卡IP地址信息:

# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ .netmask.*//g'
# ifconfig ens32 | grep netmask | sed -r 's/ +inet //' | sed -r 's/ +net.*//'

指定内容进行替换******
将每行的第一个出现的root都替换成aaaa:
# sed s/root/aaaa/ passwd.txt
将每行的所有root都替换成aaaa:
# sed s/root/aaaa/g passwd.txt
# sed /test01/s/test/aaaa/g passwd.txt
将文档中1个0及以上都改成1个0
# sed s/0+/0/g passwd.txt
关闭selinux,使用-i表示直接修改配置文件:
查询SELINUX行中将enforcing内容替换成disabled
# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

排除SELINUX行将其他行中enforcing内容替换成disabled(要用sed修改就要用到-i  g是全部执行)
# sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config

                                                                awk 主要切片列内容

awk基本格式:

awk '{pattern + action}' {filenames}

列出文件所有内容:
# awk '{print $0}' netstat.txt

列出以tcp开头的行:
# awk '/^tcp/ {print}' netstat.txt

列出以udp结尾的行:
# awk '/udp$/ {print}' netstat.txt

默认以空格为分隔符,列出第一、第四列数据:
# awk '{print $1,$4}' netstat.txt

列出第一列内容,默认以空格为分隔符:
# df -TH | awk '{print $1}'

列出第一列内容,以:为分隔符:
# awk -F: '{print $1}' passwd.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值