Linux中最重要的三个命令在业界被称为“三剑客 ”,它们是grep,sed,awk。
我们知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们的三剑客命令。
grep :过滤文本
sed : 修改文本
awk : 处理文本
使用这三个工具可以提升运维效率,熟练掌握好正则表达式是使用Linux三剑客
的前提,在说三剑客前我们要插入一个小插曲就是“正则表达式”。在掌握好正则表达式后,将具体讲解三剑客的用法。
正则表达式 正则表达式:REGular EXPression, REGEXP。我们通过特定的字符串匹配模板,来获取到所需的内容。
Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 标准正则表达式: ^ $ . * [] [^] [a-z] [A-Z] [a-zA-Z] [0-9] \ () \n 扩展正则表达式: {} {n} {n,} {n,m} {,m} + ? |
linux三剑客之grep
文本过滤器(根据文本内容过滤文件)
grep命令家族由grep, egrep, fgrep 三个子命令组成,适用于不同的场景。具体如下:
命令描述
grep 原生的grep命令,使用“标准正则表达式”作为匹配标准。
egrep 扩展的grep命令,相当于$(grep -E)
,使用“扩展正则表达式”作为匹配标准。
fgrep 简化版的grep命令,不支持正则表达式,但搜索速度快,系统资源使用率低。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 语法格式: grep [参数] [匹配规则] [操作对象] 参数: -n -A -B -C -c -o -v -q -i -l -h -b -s -w -x -R|-r -E 知识储备: $? wc 参数: -l -c 案例: [root@localhost ~] 130 [root@localhost ~] root:x:0:0:root:/root:/bin/bash [root@localhost ~] 1:root:x:0:0:root:/root:/bin/bash 21:test :x:1001:1001::/home/test /:/bin/bash 22:gf:x:1002:1002::/home/gf:/bin/bash 28:tony:x:1004:1004::/home/tony:/bin/bash 29:user:x:1006:1001::/home/user:/bin/bash [root@localhost ~] 127.0.0.1 192.168.15.100 192.168.15.255 [root@localhost ~] /dev/mapper/centos-root / xfs defaults 0 0 UUID=9f8a98b0-805c-4adf-b9ef-517a2b527f89 /boot xfs defaults 0 0 [root@localhost ~] 11 11 22 22 5 5 5 5 [root@localhost ~]
linux三剑客之sed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 语法格式 sed [参数] '处理规则' [操作对象] 参数 -n -e -i -r -f 定位 [root@localhost ~] 1111 2222 3333 4444 5555 [root@localhost ~] 1111 2222 4444 5555 [root@localhost ~] 1111 4444 5555 [root@localhost ~] gen111 222gen 333gen333 444xxx444 555gen555gen [root@localhost ~] 444xxx444 [root@localhost ~] 222gen 333gen333 444xxx444 555gen555gen [root@localhost ~] gen111 333gen333 444xxx444 [root@localhost ~] GEN111 222GEN 333GEN333 444xxx444 555gen555gen [root@localhost ~] GEN111 222GEN 333GEN333 444xxx444 555GEN555GEN [root@localhost ~] [root@localhost ~] fen111 222fen 333fen333 444xxx444 555fen555fen sed的编辑模式: d :删除 p :打印 a : 在当前行后添加一行 c :用新文本修改(替换)当前行 i : 在当前行之前,插入文本(单独使用时) r : 在文件中读内容 w : 将指定行写入文件 y : 将字符转换成另一个字符 s : 将字符串转换成另一个字符串(每一行只替换一次) g : 全部执行 i : 忽略大小写(跟 s 模式一起使用时) & :代表前面匹配到的内容 示例: [root@localhost ~] fen111 222fen xxx 333fen333 444xxx444 555fen555fen [root@localhost ~] xxx 222fen 333fen333 444xxx444 555fen555fen [root@localhost ~] fen111 222fen 333fen333 444xxx444 xxx 555fen555fen [root@localhost ~] fen111 222fen hahaha 333fen333 444xxx444 555fen555fen [root@localhost ~] [root@localhost ~] 222fen [root@localhost ~] fen111 222FEn 333fen333 444xxx444 555fen555fen
案例 1 2 3 4 5 6 7 8 9 10 11 12 13 1、将nginx.conf中的注释行全部去掉 [root@localhost ~] 2、将nginx.conf中每一行之前增加注释 [root@localhost ~] 3、要求一键修改本机的ip, 192.168.15.100 ---> 192.168.15.101 172.16.1.100 ---> 172.16.1.101 sed -i 's#.100#.101#g' /etc/sysconfig/network-scripts/ifcfg-eth[01] 4、将/etc/passwd中的root修改成ROOT sed -i 's#root#ROOT#g' /etc/passwd
linux三剑客之awk
awk是一个强大的Linux命令,有强大的文本格式化的能力。相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 语法格式: awk [选项] '模式{动作}' [文件信息] awk [参数] [处理规则] [操作对象] 参数 -F 案例: [root@localhost ~] test1d test2f test3y test4d test5f test6y test7d test7f test9y [root@localhost ~] test2f test3y test5f test6y test7f test9y 案例:打印系统所有用户的解析器 [root@localhost ~] $0 : 代表当前行 [root@localhost ~] $n : 代表第n列 [root@localhost ~] NF : 记录当前行的字段数 [root@localhost ~] $NF : 代表最后一列 [root@localhost ~] NR : 用来记录行号 [root@localhost ~] FS : 指定文本内容分隔符(默认是空格) [root@localhost ~] OFS : 指定打印分隔符(默认空格) [root@localhost ~]
awk的生命周期和处理规则的执行流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 grep、sed 和 awk 都是读一行处理一行,直至处理完成。 ① 接收一行作为输入 ② 把刚刚读入进来得到文本进行分解 ③ 使用处理规则处理文本 ④ 输入一行,赋值给$0 ,直至处理完成 ⑤ 把处理完成之后的所有的数据交给END{}来再次处理 awk [参数][分隔符] '{BEGIN{开始初需要的处理}/定位/{循环}END{结束前需要的处理}}' [操作对象] BEGIN{} // {} END{}
awk中的函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 print : 打印 printf : 格式化打印 参数: %s %d - + 15 [root@localhost ~] | /bin/bash|root | | /sbin/nologin|bin | | /sbin/nologin|daemon | | /sbin/nologin|adm | | /sbin/nologin|lp | | /bin/sync|sync | | /sbin/shutdown|shutdown | | /sbin/halt|halt | | /sbin/nologin|mail | | /sbin/nologin|operator | | /sbin/nologin|games | ......
awk中的定位和流程控制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 [root@localhost ~] [root@localhost ~] > < >= <= ~ !~ 案例:要求打印属组ID大于属主ID的行 [root@localhost ~] 案例:结尾包含bash [root@localhost ~] 案例:结尾不包含bash [root@localhost ~] && [root@localhost ~] || [root@localhost ~] ! [root@localhost ~] + - * / % 案例:要求属组 + 属主的ID 大于 2000 [root@localhost ~] 案例:要求属组 * 属主的ID 大于 2000 [root@localhost ~] 案例:要求打印偶数行 [root@localhost ~] 案例:要求打印奇数行 [root@localhost ~] == > < >= <= 案例:要求打印第三行 [root@localhost ~] 案例: [root@localhost ~] 只存在循环之中。 if [root@localhost ~] if (){} if (){}else {} if (){}else if (){}else {} for [root@localhost ~] for (i="初始值" ;条件判断;游标){} while [root@localhost ~] while (条件判断){} 每隔5行,打印一行横线 ------------------------------------------------------------------------- [root@localhost ~]