Linux三剑客及使用介绍
Linux 三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。在掌握好正则表达式后,将具体讲解三剑客的用法。 一、正则表达式正则表达式:REGular EXPression,REGEXP 元字符: .: 匹配任意单个字符 []: 匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 字符集合:[:digit:],[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:] 注意:字符集合要用[ ]包含 匹配次数(贪婪模式): *: 匹配其前面的字符任意次 a,b,ab,aab,acb,adb,amnb a*b, a?b a.*b .*: 任意长度的任意字符 ?: 匹配其前面的字符1次或0次 +:匹配至少一次 {m,n}:匹配其前面的字符至少m次,至多n次 {1,} {0,3} 备注:至少0次,必须要显示的写出来。 位置锚定: ^: 锚定行首,此字符后面的任意内容必须出现在行首 $: 锚定行尾,此字符前面的任意内容必须出现在行尾 ^$: 空白行 &;或b: 锚定词首,其后面的任意字符必须作为单词首部出现 &;或b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现 分组: () (ab)* 后向引用 1: 引用第一个左括号以及与之对应的右括号所包括的所有内容 2: 3: 可以看到标准正则表达的使用过程中,许多符号都需要转义,这在工作中带来了一定的不便,因此扩展的正则表达式便出现了。 二、拓展正则表达式1. 字符匹配: . [abc]:包含abc任意一个字符 [^abc]:不包含abc任意一个字符 2. 次数匹配(不用再转义): *: ?: +: 匹配其前面的字符至少1次 {m,n} 3. 位置锚定: ^ $ &; &; 4. 分组(不用再转义): ():分组 1,2,3,... 5. 或者 |: or C|cat: C或cat(表示的是整个部分) 可以看到,使用扩展的正则表达式可以省略很多的转义符号,这尤其在写sed语句时极大的提高了代码的可读性。建议优先使用扩展的正则表达式。 三、grep命令家族3.1. grep相关命令grep命令家族由grep,egrep,fgrep 三个子命令组成,适用于不同的场景。具体如下: 3.2. 使用方法语法 四、sed命令4.1. 概述sed全称是Stream EDitor 4.2 基本语法sed [option] ‘script‘ [input file]... script部分
4.3.sed高级用法
在模式空间中,完成匹配的操作。当没有匹配上的时候,文本行内容会默认输出stdout;当匹配上文本行的时候,会执行编辑命令,执行结果输出到stdout中。
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:在原有的每行后方添加一个空白行;
/bin/bash info="hellozimskyshenzhen" echo $info | sed 's/hello(w+)shenzhen/1/g'
#!/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. 语法 2. awk读取文档过程 3. 选项option 4. PATTERN(用于定界) 举例: awk -F: '$NF=="/bin/bash" {print $1,$NF}' /etc/passwd awk -F: '$NF!"/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 %10sn",$1,$2}' /etc/passwd 5. 变量
6. 常用的ACTION命令
# 一般来说,打印无状态内容放在BEGIN和END块中 awk -v begin="hello" -v end="ok" -F: 'BEGIN{print begin}; {print $1,$NF}; END{print end}' /etc/passwd 5.3. awk高级用法及举例awk常用内置变量 $1:表示第一列 $NF:表示最后一列 $NR:表示行号 常用条件表示 1) /指定内容/ 这种方式可以匹配到含有“指定内容”的行,在条件中不添加$#所带的项,建议不使用正则,有异常情况。 awk -F: '/nologin/{print $0}' /etc/passwd #匹配到含有nologin关键字的行 seq 100 | awk '/1/{print $1}' 2) $#=/指定内容/ 这种方式指定第#列匹配指定内容 awk -F: '$1=/bin/{print $0}' /etc/passwd 3) $#~/指定内容/ 这种方式用于指定列模糊匹配(正则匹配)指定内容,并获取该行。 awk -F: '$1~/dae/{print $1}' /etc/passwd #正向选择 awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向选择 4) 值判断 使用>,>=,==,!=来判断指定列的值。 awk -F: '$3>=10{print $1}' /etc/passwd 5) 逻辑判断 使用&&,||来进行逻辑判断。 awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd 6) if条件判断 awk -F: '{if ($NF~/nologin$/){i++}else{j++}}; END{print i,j}' /etc/passwd #注意if-else条件判断是放在{}中的 7) 字典使用 在awk中可以定义数组类型,用于统计。 awk '{ip[$1]++}; END{for (i in ip) {print i,ip[i]}}' access.log #解析: 将第一列ip设置为字典的key,当出现一次相同的ip时自增1,用于统计所有的ip计数。 #for循环中取到每个字典对应的key,再使用print块打印出来。注意花括号的隔离。 #QQ号 等级 时长 #统计等级(30<=x<=90),相同账号的时长 #1234 12 23 #1234 10 122 #1233 92 4212 #1233 42 4252 #1239 87 2313 #1233 56 1121 #1231 19 45 #1235 45 679 cat data | awk '$2>=30&&$2<=90{dic[$1]+=$3}; END{for (i in dic) {print i,dic[i]}}' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |