Linux三剑客

导读:本篇文章讲解 Linux三剑客,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Linux 天龙三兄弟

下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是grep、sed、awk.

我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。

三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长取行、sed擅长取行和修改、awk擅长取列。

在说这三个命令前我们要插入一个小插曲就是“正则表达式”。

一、正则表达式

所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

三剑客与正则表达式是什么关系呢?

我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!

现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。具体如下

字符类

       .:匹配任意单个字符

      []:匹配中括号内的任意一个字符

      -:在[ ]中括号内表示字符的范围

      ^:位于[ ]中括号内的开头,匹配除括号内的字符之外的任意一个字符

数量限定符

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

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

      *: 匹配其前面的字符任意多次

     {N}:匹配其前面的字符N次

     {N,}:匹配其前面的字符至少N次

     {,M}:匹配其前面的字符最多M次

     {N,M}:匹配其前面的字符N到M次

位置限定符

      ^:匹配行首的位置

      $:匹配行尾的位置

     \<:匹配单词开头的位置(比如\<ro匹配root或robot)

     \>:匹配单词结尾的位置(比如ot\>匹配root或robot)

     \<word\>:精准匹配单词word

天龙三兄弟 “萧峰”: awk

报告生成器,格式化文本输出,有多种版本:New awk(nawk),GNU awk( gawk)

注意:program部分只能用单引号,不能用双引号,否则会报错.

awk [options] 'program' file
1、常用命令选项
-F            指定分隔符,默认空格或Tab键
-f            调用awk脚本
-v            调用外部shell变量

2、awk内置变量
$1..$n        指定分隔符号对应的值
$0            当前行的内容
$NF           最后一列
NF            指定分隔符号后,行的列数
NR            当前行的行号
FS            保存或设置字段分隔符
FNR           保存当前文件的行数
FILENAME      保存当前的文件名
ENVIRON       调用shell环境变量
awk '{print $0}' a.txt               #打印文件所有内容($0代表整行)
awk '{print $1,$2}' a.txt            #打印第1列和第2列的内容
awk -F":" '{print $1,$2}' OFS="," a.txt           #以:为输入分隔符并且以,为输出分隔符打印第1列和第2列的内容
awk -F"," '{print NR,$NF}' a.txt        #以,为分隔符并打印行号和最后一列
awk -F"[ .]" '{print $(NF-1)}' OFS="\t" a.txt     #以空格或.为输入分隔符并以制表符为输出分隔符打印倒数第二列

3、正则表达式
/正则/        匹配正则()
~/正则/       匹配正则()
!~/正则/      不匹配
awk -F":" '$1~/root/ {print $0}'  /etc/passwd 
awk -F":" '$1!~/root/ {print $0}'  /etc/passwd 
awk -F":" '$1~/^ro/ {print $3}' /etc/passwd
awk -F":" '$1~/[0-9]/ {print $1,$6}' /etc/passwd

4、数值比较  
awk -F":" '$3==0{print $0}' /etc/passwd
awk -F":" '$3!=0{print $0}' /etc/passwd
awk -F":" '$1=="root"{print $0}'  /etc/passwd

5、逻辑比较(多个条件)
逻辑与 &&  多个条件同时成立
逻辑或 ||  多个条件有一个成立
逻辑非 !   取反
awk  -F":" '$7=="/bin/bash" && $3<500{print $0}' /etc/passwd
awk  -F":" '$7=="/bin/bash" || $3<500{print $0}' /etc/passwd

天龙三兄弟 “虚竹”: sed

sed是一种流编辑器,作用是实现对文件的增删改查,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed [option]... 'script' inputfile
sed            流编辑器,实现对文件的增删改查
选项:
-n             屏蔽默认输出
-i             直接修改源文件
-e             可指定多个处理动作
-r             支持扩展表达式
{}             可组合多个命令,以;分隔
-f             使用sed脚本
定址符:
p              打印行
d              删除行
s              字符串替换
1              对第1行处理
1,3            对第1到3行处理
1,+3           对第1行后面3行处理
1~2            对1,3,5,7……行处理
1,$            对1行到最后1行处理
/aa/,/bb/      对a行到b行处理
/aaa/,9        对a行到第9行,若前9行没有,会显示后9行匹配的行
举例子:(注意:sed增删改如果不加 -i 选项的话只是预览模式,并没有真的增删改)

增:
i    行前插入        
a    行后插入
sed -i '2ixx' m.txt              在第2行前插入行xx
sed -i '3,6ixx' m.txt            在第3-6行每行前插入xx
sed -i '2axx' m.txt              在第2行后插入xx
sed -i '/^yy/axx' m.txt          在yy开头的行后插入xx
删:
sed -i '3,5d' a.txt              删除第3到5行
sed -i '/xml/d' a.txt            删除所有包含xml的行
sed -i '/xml/!d' a.txt           删除不包含xml的行
sed -i '/^xml/d' a.txt           删除以xml开头的行
sed -i '$d' a.txt                删除最后1行
sed -i '/^$/d' a.txt             删除所有空行
sed -i '/^$/{n;/^$/d}' a.txt     删除重复空行,连续两个空行只保留一个
sed -i -r'/a|b/d' a.txt          删除a或b的行
sed -i '2,~2d' a.txt             删除2行到2的倍数行
改(-i选项才会真的修改源文件):
c    行替换
s    字符串替换
g    global(全局替换)
sed -i '2cxx' m.txt              第2行替换成xx
sed -i '3,6cxx' m.txt            第3到6行替换成1行xx
sed -i -e '3cxx' -e '6cxx' m.txt 第3行和第6行替换成xx
sed -i '2cxx\nyy' m.txt          第2行替换成xx并换行写上yy(\n代表换行)
sed -i 's/test/demo/g' a.txt     将所有的test换成demo(常用)
sed -i 's/#ipv6=no/ipv6=yes/g' test.txt    将test.txt文件里的#ipv6=no改成ipv6=yes(sed的这种用法经常用来更改配置文件里的内容)   
sed -i 's/a//g' a.txt            删除所有行的a
sed -i '4,7s/^/#/' a.txt         4到7行加#号
sed -i '4,7s/^#//' a.txt         4到7行去掉#号
sed -i 's/a/B/ig' a.txt          所有行的a替换成B(不区分大小写)
查:
sed –n ’20,30p’ b.txt         打印20到30行
sed -n '3p;6p'  a.txt         打印第3和6行
sed -n '3,+6p'  a.txt         打印第3行及其后6行
sed -n '/^bin/p' a.txt        打印以bin开头的行
sed -n 'p;n' a.txt            打印奇数行,n表示读下一行(隔行)
sed -n 'n;p' a.txt            打印偶数行,n表示读下一行(隔行)
sed -n '8,${n;p}' a.txt       打印8行到末尾所有的偶数行
sed -n '$=' a.txt             打印文件的行数
sed -n '/a/{=;p} ' b.txt      显示行号
sed -n l aaa.jpg              打印不可见字符

天龙三兄弟 “段誉”: grep

文本过滤(模式:pattern)工具,grep, egrep

grep [options] pattern [file...]
--color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat-e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
举例子:

grep root passwd.txt        #查找文件内容包含root的行

grep -i root passwd.txt        #查找文件内容包含root(忽略大小写)的行

grep -v root passwd.txt        #查找文件内容不包含root的行

grep -w "root" passwd.txt        #查找文件内容包含整个单词"root"的行

grep ^s passwd.txt      #查找以s开头的行

grep n$ passwd.txt      #查找以n结尾的行

egrep "^([0-9]{1,3}.){3}[0-9]{1,3}$" log.txt | sort | uniq -c       #找出log文件中的所有ip地址并统计每个ip出现的次数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76919.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!