基本的正则表达式元字符:默认工作于贪婪模式;
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配范围外的任意单个字符;
[:digit:]数字、[:lower:]小写字母、[:upper:]大写字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母数字、[:punct:]标点符号
匹配次数:
*:匹配前面的字符任意次;
.*:任意长度的任意字符;
\?:匹配前面的字符0-1次;即前面的字符可有可无;
\+:匹配前面的字符至少1次;
\{m\}:匹配前面的字符m次;
\{m,n\}:匹配前面的字符m到n次;
位置锚定:
^:行首锚定
$:行尾锚定
^pattern$:用于模式匹配整行;
\<或\b:词首锚定;用于单词模式的左侧;
\>或\b:词尾锚定;用于单词模式的右侧;
\<pattern\>:匹配整个单词;
分组:
\(pattern\):将括号内的作为整体来匹配;
注意:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,…
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
向后引用:引用前面分组括号中的模式所匹配字符,(而非模式本身);
扩展的正则表达式元字符:默认工作于贪婪模式;
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配范围外的任意单个字符;
[:digit:]数字、[:lower:]小写字母、[:upper:]大写字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母数字、[:punct:]标点符号
匹配次数:
*:匹配前面的字符任意次;
.*:任意长度的任意字符;
?:匹配前面的字符0-1次;即前面的字符可有可无;
+:匹配前面的字符至少1次;
{m}:匹配前面的字符m次;
{m,n}:匹配前面的字符m到n次;
位置锚定:
^:行首锚定
$:行尾锚定
^pattern$:用于模式匹配整行;
\<或\b:词首锚定;用于单词模式的左侧;
\>或\b:词尾锚定;用于单词模式的右侧;
\<pattern\>:匹配整个单词;
分组:
(pattern):将括号内的作为整体来匹配;
或者:
a|b:整个左侧或者整个右侧;
linux文本处理三剑客:grep、sed、awk
grep,egrep,fgrep:文本过滤工具:pattern;
grep [options] pattern [file…]
常用选项:
–color=auto:对匹配到的文本着色显示;
-v:显示不能够被pattern匹配到的行;
-i:忽略大小写;
-o:仅显示匹配到的字符串本身;
-q:静默模式
-A #:显示匹配到的行及以后#行;
-B #:显示匹配到的行及行前#行;
-C #:显示匹配到的行及前后各#行;
-E:支持扩展正则表达式匹配
sed:行编辑器:模式空间、保持空间;
sed:文本流的行编辑器;
用法:
sed [OPTION]… ‘script’ input-file…
script:’地址命令’
常用选项:
-n:不输出模式空间中的内容至屏幕;
-e:多点编辑;
-f /path/to/script_file:从指定文件中读取编辑脚本;
-r:使用扩展正则表达式;默认使用基本正则表达式;
-i:修改源文件
地址定界:
(1)不给地址:对全文进行处理;
(2)单地址:#:指定的行;/pattern/:被此处模式所匹配到的每一行;
(3)地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4)~:步进
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除;
p:显示当前模式空间中的内容;
a \text:在行后面追加文本,支持使用\n多行追加;
i \text:在行前面插入文本,支持使用\n多行追加;
c \text:替换行为单位或多行文本;
w /path/to/somewhere:保存模式空间中匹配到的行到指定文件中;
r /path/to/somewhere:读取指定文件的文本流至模式空间中匹配到的行的行后;
=:为模式空间中的行打印行号;
!:取反条件;对地址定界条件取反;
s ///:查找替换;支持使用其他分隔符:s@@@,s###;
替换标记:g:行内全面替换;默认只替换首个;
可以使用&后项引用;例如 # sed ‘s@r..t@&er@’ /etc/passwd
也可以使用分组引用;例如 # sed ‘s@\(r..t\)@\1er@’ /etc/passwd
高级编辑命令:保持空间hold space;
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:从保持空间中取出数据覆盖至模式空间;
G:从保持空间中取出数据追加至模式空间;
x:把模式空间中的内容与保持空间的内容互换;
n:读取匹配到的行的下一行至模式空间;
N:追加匹配到的行的下一行至模式空间;
d:删除模式空间的行
D:删除多行模式空间中的所有行;
例子:
sed -n ‘n;p’ file:显示偶数行;
sed ‘1!G;h;$!d’ file:逆序显示;
sed ‘$!N;$!D’ file:取出文件后两行
sed ‘$!d’ file:取出文件最后一行
sed ‘G’ file:每一行后加一个空白行
sed ‘/^$/d;G’:删除多行空白行且每行后增加一个空白行
sed ‘n;d’ file:显示奇数行
sed -n ‘1!G;h;$p’ file:逆序显示
awk:报告生成工具,格式化文本输出;注意:变量引用,无需加$
基本用法:gawk [options] ‘program’ FILE …
program:pattern{action statements}:语句之间用分号分隔。
options:常用选项
-F:指明输入时用到的字段分隔符;
-v var=value:自定义变量;
输出命令:
1、print item1,item2,…:
要点:(1)、逗号分隔
(2)输出的各item可以是字符,也可以是数值:当前记录的字段、变量
(3)如省略item,相当于print $0;
2、变量:
内建变量:
FS:输入字段分隔符;默认为空白字符
OFS:输出字段分隔符;默认为空白字符
RS:输入时的换行符
ORS:输出时的换行符
{print NF}、{print $NF}
NF:字段数量
$NF:最后一个字段
NR:逐行显示行数
FNR:各文件分别计数:逐行显示行数
FILENAME:逐行显示文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
自定义变量:变量名区分字符大小写;
(1)-v var=value
(2)在program中直接定义
3、printf命令
格式化输出:printf FORMAT, item1, item2, …
要点:(1)FORMAT必须给出;
(2)不会自动换行,需要显示给出换行控制符,\n;
(3)FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:
%c:显示字符的ASCII码;
%d,%i:显示十进制整数;
%e,%E:科学计数法数值显示;
%f:显示为浮点数;
%g,%G:以科学计数法或浮点形式显示数值;
%s:显示字符串;
%u:无符号整数;
%%:显示%自身;
示例:# awk -F: ‘{printf “UNAME:%s,UID:%d\n”,$1,$3}’ /etc/passwd
修饰符:
#[.#]:第一个#控制显示的宽度,第二个#表示小数点后的精度;默认右对齐
-:左对齐
+:显示数值的符号
4、操作符:
算术操作符:x+y、x-y、x*y、x/y、x^y、x%y、-x、+x
字符串操作符:默认没有符号的操作符,字符串连接
赋值操作符:=,+=,-=,*=,/=,%=,^=,++,–
比较操作符:>,>=,<,<=,!=,==
模式匹配符:~:是否匹配,!~:是否不匹配
逻辑操作符:&&,||,!
函数调用:function_name(argu1,argu2,…)
条件表达式:
selector?if-true-expression:if-false-expression
示例:
# awk -F: ‘{$3>=1000?utype=”admin”:utype=”comm”;printf “%20s:%s\n”,$1,utype}’ /etc/passwd
5、PATTERN
(1)空模式:匹配每一行;
(2)/regular expression/:仅处理能够被此处模式匹配到的行;
(3)relational expression:关系表达式;结果有真有假;结果为真的才会处理;
真:结果为非0值,非空字符串;
示例:# awk -F: ‘$3>=1000{print $1,$3}’ /etc/passwd
(4)地址定界:
起始行,结束行:/pat1/,/pat2/:注意:不支持直接给出数字的格式
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件的每一行文本之前执行一次;
END{}:仅在文本处理完成之后命令执行之前执行一次;
6、常用action
(1)expression表达式
(2)control statements控制语句:if,while等;
(3)组合语句:
(4)输入语句
(5)输出语句
7、控制语句
if(condition) {statements}:单分支
if(condition) {statements} else {statements}:多分支
使用场景:对awk取得的整行或者某个字段做条件判断;
例子:
# awk -F: ‘{if ($3>=1000) {printf “cuser: %s\n”,$1} else {printf “suser: %s\n”,$1}}’ /etc/passwd
# awk -F: ‘{if ($NF==”/bin/bash”) {print $1,$NF}}’ /etc/passwd
while(condition) {statements}:
使用场景:对一行内的字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
# awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}’ /etc/grub2.cfg
do {statements} while(condition):意义:至少执行一次循环
for(expr1;expr2;expr3) {statements}:
例子:
# awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
特殊用法:能够遍历数组中的元素:
语法:for(var in array) {for-body}
switch语句:多分支if语法
switch(expression) {case value1 or /REGEXP/: statement; case value2 or /REGEXP/: statement; …;default: statement}
continue:提前结束第n层的本轮循环,而直接进入下一轮判断;
break [n]:提前结束循环;
next:提前结束本行的处理而直接进入下一行:
例子:
# awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd :显示偶数行;
delete array[index]
delete array
exit
{ statements }
8、awk中的array数组
array[index-expression]
index-expression:
(1)可使用任意字符串;字符串要使用双引号;
(2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
若要判断数组中是否存在某元素,要使用“index in array”格式进行;
若要遍历数组中的每个元素,要使用for循环;
语法:for(var in array) {for-body}:注意var会遍历array的每个索引;
例子:
# awk ‘BEGIN{wd[“1″]=”mday”;wd[“2″]=”tday”;for(i in wd) {print wd[i]}}’
# netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}’
LISTEN 6
ESTABLISHED 1
例子:统计某文本每个字段出现的次数;
# awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}’ /var/log/secure
9、函数
常用内置函数:
数值处理:
rand():返回0和1之间一个随机数;
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s,[t]):以r表示的模式来查找t所表示的字符串中的匹配的内容,并将其第一次出现替换为s所表示的内容;
gsub:同上,表示全局替换;
split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;
例子:
# netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}END{for(i in count){print i,count[i]}}’
# netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);for(i in ip){print ip[i]}}’
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/93414