Linux三剑客及使⽤介绍
前⾔
Linux 三剑客是(grep,sed,awk)三者的简称,熟练使⽤这三个⼯具可以提升运维效率。Linux 三剑客以正则表达式作为基础,⽽在Linux 系统中,⽀持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。在掌握好正则表达式后,将具体讲解三剑客的⽤法。
⼀、正则表达式
正则表达式:REGular EXPression, REGEXP。我们通过特定的字符串匹配模板,来获取到所需的内容。熟练掌握好正则表达式是使
⽤Linux三剑客的前提啊。
元字符
.: 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
字符集合
[[:digit:]]:匹配单个数字;
[[:lower:]]:匹配单个⼩写字母;
[[:upper:]]:匹配单个⼤写字母;
[[:punct:]]:匹配单个标点字符;
[[:space:]]:匹配单个空⽩字符;
[[:alpha:]]:匹配单个字母;
[[:alnum:]]:匹配单个字母或数字;
匹配次数(贪婪模式)
*:匹配其前⾯的字符任意次
:
匹配其前⾯的字符0次或者1次
+:匹配其前⾯的字符⾄少1次
.*:任意长度的任意字符
位置锚定
^: 锚定⾏⾸,此字符后⾯的任意内容必须出现在⾏⾸
$: 锚定⾏尾,此字符前⾯的任意内容必须出现在⾏尾
^$: 空⽩⾏
LInux实际使⽤
由于linux系统shell解释器的特殊处理,某些元字符在linux下具有展开式等特殊含义,在实际的使⽤过程中我们需要添加\进⾏转义。\?:匹配其前⾯的字符1次或0次;
\+:匹配⾄少⼀次;
\{m,n\}:匹配其前⾯的字符⾄少m次,⾄多n次;
\{1,\}:匹配前⾯的字符⾄少1次;
\{0,3\}:匹配前⾯的字符0次⾄3次均可;
备注:⾄少0次,必须要显⽰的写出来;
\<;或\b:锚定词⾸,其后⾯的任意字符必须作为单词⾸部出现
\>或\b:锚定词尾,其前⾯的任意字符必须作为单词的尾部出现
分组与后向引⽤
\(\)
\(ab\)*
\1:引⽤第1个左括号以及与之对应的括号所包括的所有内容;
\2:引⽤第2个左括号以及与之对应的括号所包括的所有内容,以此类推;
⼆、拓展正则表达式
可以看到标准正则表达的使⽤过程中,许多符号都需要转义,这在⼯作中带来了⼀定的不便,因此扩展的正则表达式便出现了。
字符匹配:
.:匹配单个字符;
[abc]:包含abc任意⼀个字符
[^abc]:不包含abc任意⼀个字符
次数匹配(不⽤再转义):
*:匹配前⼀个字符任意次;
:匹配其前⾯的字符1次或0次;
+:匹配其前⾯的字符⾄少1次;
{m,n}:匹配其前⾯的字符⾄少m次,⾄多n次;
位置锚定:
对⽐使⽤⽅式:^和$
这⾥要注意的是对于词⾸定位和词尾定位,分别是\<;和\>,依然需要加上反斜杠;
分组(不⽤再转义):
():分组
\1, \2, \3:分别对应第n个括号所匹配的内容;
或运算
|:可以同时取并集;
注意:C|cat表⽰的是C或cat(表⽰的是整个部分)
可以看到,使⽤扩展的正则表达式可以省略很多的转义符号,这尤其在写sed语句时极⼤的提⾼了代码的可读性。建议优先使⽤扩展的正则表达式。
三、grep命令家族
3.1. grep相关命令
grep命令家族由grep, egrep, fgrep 三个⼦命令组成,适⽤于不同的场景。具体如下:
命令描述
grep 原⽣的grep命令,使⽤“标准正则表达式”作为匹配标准。
egrep 扩展的grep命令,相当于$(grep -E),使⽤“扩展正则表达式”作为匹配标准。
fgrep 简化版的grep命令,不⽀持正则表达式,但搜索速度快,系统资源使⽤率低。
3.2. 使⽤⽅法
语法
grep [options] PATTERN []
options部分
-i:忽略⼤⼩写
--color:⾼亮匹配上的字符串
-
v: 显⽰没有被模式匹配到的⾏
-o:只显⽰被模式匹配到的字符串三目条件运算符?:的含义
-E:使⽤扩展的正则表达式,egrep=grep -E
PATTERN部分
以字符串的⽅式给定匹配模板,可以使⽤普通字符串以及正则表达式(标准&扩展)。
FILE部分
需要查内容的⽂件。
四、sed命令
4.1. 概述
sed全称为Stream EDitor,sed是⼀个流编辑器,在处理⾏内容时功能⼗分强⼤。
4.2 基本语法
sed [option] 'script' [input file]...
1.option部分
-n:不输出模式空间中未匹配上的内容stdout,详情可以看4.3⾼级⽤法;
-e:可以在sed命令中指定多个script脚本,多点编辑功能;
-f:输⼊sed脚本,脚本中写着编辑命令;
-r:⽀持使⽤扩展的正则;
-i:直接编辑源⽂件;
2.script部分
script部分包含两个内容,其⼀是定界,即确定我们要操作的范围。另⼀个内容是操作,⽐如替换、插⼊当前⾏或在后⾯插⼊等操作。
a)定界-空地址
即全⽂编辑;
b)定界-单地址:
n:指定第n⾏,对特定⾏进⾏编辑;举例:sed -n '1p' passwd仅输出第⼀⾏;
/pattern/:指定模式匹配到的那⼀⾏,注意这⾥的pattern不是扩展正则表达式,如果要⽤扩展的正则表达式,需要在option需要使⽤-r;举例:sed -n '/sbin/p' passwd输出能够匹配上sbin的内容⾏;
c)定界-范围:
n,m:定位从第n⾏开始⾄第m⾏(都是闭区间);
n,+k:定位从第n⾏开始,包括往后的k⾏;
n,/pattern/:定位从第n⾏开始,⾄指定模式匹配到的那⼀⾏;
/pattern1/,/pattern2/:定位从pattern1模式匹配开始,直到pattern2模式匹配之间的范围;
d)定界-步进⽅式:
1~2:以1为起始⾏,然后步进2⾏向下匹配,即所有的奇数⾏;
2~2:以2为起始⾏,然后步进2⾏向下匹配,即所有的偶数⾏;
e)编辑操作:
d:删除整⾏,d放在定界后⾯。举例:sed '/sbin/d' passwd;
p:显⽰模式空间中的内容, p放在定界后⾯。⼀般来说,p操作和-n选项配合使⽤,筛选出我们匹配的⾏。若不加-n的话,由于模式空间中未匹配上的⾏也会输出,我们会发现所有内容都输出并且匹配⾏会输出2次;
a:在匹配的⾏后⾯增加⽂本,使⽤\n⽀持多⾏追加,a放在定界后⾯。举例:sed '1a first_line\nsecond_line' passwd在第1⾏后⾯插⼊两⾏内容(first_line 和 second_line);
i:在匹配的⾏前⾯增加⽂本,i放在定界后⾯。举例:sed '3i hello' passwd;
c:替换匹配⾏为指定的⽂本。举例:sed '/root/c text' passwd把匹配到的⾏替换成text;
w:保存模式空间中匹配的内容到指定位置。举例:sed -n '/^[^#]/w /tmp/demo' /etc/fstab即将/etc/fstab中⾮#开头的⾏输出保存到/tmp/demo 中。
r:读取指定⽂件的内容添加到当前⽂件匹配到的⾏后⾯,进⾏⽂件合并。举例:sed '2r /etc/passwd' 1.txt即将/etc/passwd⽂件的内容读取,并插⼊到1.txt⽂件的第⼆⾏处。
!:条件取反。⽤法:地址定界!编辑命令。
s///:条件替换,这⾥的/可以⽤其他特殊符号,其替换分隔符的判定标准是s字符后的第⼀个特殊符号。这在替换⽂本中涉及特殊符号时特别好使,我们避开需要替换的特殊符号即可。即sed 's@root@me@g' /etc/passwd等同于sed 's/root/me/g' /etc/passwd。
替换标记备注:g(全局替换),p(显⽰替换成功的⾏)
替换举例:根据输⼊查⽬录,下⾯输出的是/var/log/
echo "/var/log/messages" | sed 's@[^/]\+$/\?@@'
4.3.sed⾼级⽤法
1.模式空间与保持空间
在模式空间中,完成匹配的操作。当没有匹配上的时候,⽂本⾏内容会默认输出stdout;当匹配上⽂本⾏的时候,会执⾏编辑命令,执⾏结果输出到stdout中。
保持空间可以理解为⼀个暂存区,只是⽤于完成额外的动作。
2.相关参数
h:把模式空间中的内容覆盖⾄保持空间中;
H:把模式空间中的内容追加⾄保持空间中;
g:把保持空间中的内容覆盖⾄模式空间中;
G:把保持空间中的内容追加⾄模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的⾏的下⼀⾏(改变指向)⾄模式空间中;
N:追加读取匹配到的⾏的下⼀⾏(改变指向)⾄模式空间中;
d:删除模式空间中的⾏;
D:删除多⾏模式空间中的所有⾏;
3.举例
sed -n 'n;p' FILE:显⽰偶数⾏;
sed '1!G;h;$!d' FILE:逆序显⽰⽂件的内容;
sed '$!d' FILE:取出最后⼀⾏;
sed '\$!N;$!D' FILE:取出⽂件后两⾏;
sed '/^$/d;G' FILE:删除原有的所有空⽩⾏,⽽后为所有的⾮空⽩⾏后添加⼀个空⽩⾏;
sed 'n;d' FILE:显⽰奇数⾏;
sed 'G' FILE:在原有的每⾏后⽅添加⼀个空⽩⾏;
4.基础⾯试题举例
⾯试题1:提取字符串中的指定字符串
/bin/bash
info="hellozimskyshenzhen"
echo $info | sed 's/hello\(\w\+\)shenzhen/\1/g'
注意事项:
sed中不⽀持\d,如果要⽤数字⽤[0-9],但是⽀持\w。
在⼀般正则表达式中,sed中的()要转义,+要转义,<>要使⽤\转义。如果不想这么⿇烦,那就加上-r选项使⽤扩展正则表达式吧!
⾯试题2:判断输⼊是否为整数
#!/bin/bash
if [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ] ; then
echo 'yes'
else
echo 'no'
fi
五、awk命令
5.1. awk概述
awk是发明该⼯具三个作者姓名的⾸字母简称,awk是⼀个报表⽣成器,主要⽤于格式化输出。格式化⽂本输出器。
5.2. 基本⽤法
1.语法
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk按照⾏来读取⽂档,根据输⼊分隔符切分成⼩部分(⽤內建变量来表⽰$0,$1,$2等),⽤ACTION STATEMENTS来处理该⾏⽂本。$0表⽰显⽰整⾏。
2.常⽤选项option
-F:指名输⼊字段的分隔符;
-v:⽤来实现⾃定义变量var=value;
3.PATTERN(⽤于定界)
``:表⽰处理⽂件的所有⾏;
/pattern/:表⽰处理正则匹配对应的⾏;
!/pattern/:表⽰处理正则不匹配的⾏;
关系表达式:⽐如NR>2等返回布尔类型的表达式。若结果为真则处理,假则不处理。对于⾮0⾮空字符串为真,其余为假。
n:表⽰处理第n⾏的⽂本,注意这⾥不⽀持直接给出数字的格式,例如1,2{...}。详情请见举例。
BEGIN/END模式:BEGIN{}表⽰仅在开始处理⽂件中的⽂本之前执⾏⼀次的程序,例如打印表头。END{}表⽰⽂本处理完成之后执⾏⼀次,例如汇总数据。
举例:
# 在/etc/passwd⽂件中,以:为分隔符,筛选出最后⼀列为/bin/bash的⾏,并打印第⼀列和最后⼀列
awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwd
awk -F: '$NF!="/bin/bash"{print $1,$NF}' passwd
awk -F: '$3<1000 {print $1, $3}' /etc/passwd
awk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd ⾏定界
awk -F: '{printf "%-15s %10s\n", $1, $2}' /etc/passwd
4.內建变量(在引⽤变量时不⽤加$)
FS:input field seperator:输⼊字段分隔符,默认空⽩字符。也可使⽤-v指定。
OFS:输出字段分隔符。使⽤-v指定。
RS:输⼊时的换⾏符
ORS:输出时的换⾏符
NF:number of field 每⼀⾏的字段数量。加上$NF表⽰最后⼀列。
NR:number of record ⽂件的⾏数,打印出来是打印⾏号
FNR:多个⽂件中的⾏数分别计数
FILENAME:当前⽂件的⽂件名
ARGC:参数命令⾏中参数的个数
ARGV:返回数组,命令⾏中的每个参数
举例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue
在这⾥ARGV[0]是awk,固定为第0个参数。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue
举例:awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd 指名冒号作为输⼊的分隔符。同awk -F: ...
5.⾃定义变量
⽅法1:-v var=value (区分字符的⼤⼩写)
⽅法2:在program中定义
举例:awk -v test='hello' 'BEGIN {print test}'
awk 'BEGIN {test='hello' print test}'
6.常⽤的ACTION命令
print
输出格式:print item1,item2 ...
备注:使⽤逗号作为分隔符;输出item可以是字符串、內建变量、awk表达式;若省略item,则显⽰$0整⾏;
printf
格式化输出:printf FORMAT, item1, 按位放在format中。
注意事项:format必须要给出;如需换⾏,必须要显⽰写出;format中需要为后⾯每个item指定格式符;
Expressions
Control statements:控制语句if,while
if(condition){statement}
if(condition){statement} else {statements}
while(condition) {statements}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array删除整个数组
exit 退出语句
Compound statements:组合语句
Input statements:输⼊语句
Output statements:输出语句
格式符:
%c:显⽰字符的ASCII值
%d:显⽰⼗进制整数
%e:科学计数法数值显⽰
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论