Link之正则表达式及命令 “sed” 和 “awk” 用法

本篇文章主要分三个部分,第一部分介绍正则表达式的用法,为接下来命令的学习打基础,第二部分介绍“sed”命令,第三部分介绍‘awk”命令。

linux三大利器
grep:查找
sed:行编辑器
awk:文本处理工具

一,正则表达式
正则表达式应用场景
1,查找所有包含‘linux’的行
2,取出以‘abc’开头的所有单词
3,匹配两位数,密码,qq号,身份证号等
学习方法:grep ‘字符串’ 从哪个文件查找

正则表达式单字符(passwad为文件名)
1,特定字符:
例:grep ‘a’ passwad

2,范围内字符:单个字符[]
数字字符:[0-9],[259]
例:grep ‘[0-9]’ passwad
小写字符:[a-z]
大写字符:[A-Z]
所有大小写字符:[a-zA-Z]
标点字符:[, ; /]
反向字符:[^0-9]

3,任意字符
例:grep ‘.’ passwad
注意:’\.'不代表任意字符只代表 “.”

正则表达式中其他符号
4,边界字符:头尾字符
^ : ^root 表示以root开头的一行
$ : false$ 表示以false结尾的一行
空行的表示:^$

5,元字符(代表普通字符或特殊符号)
\w : 匹配任何字类字符,包括下环线([A-Za-z0-9_])
\W:匹配任何非字类字符([^A-Za-z0-9_])
例:grep ‘\w’ passwad
\b:代表单词的分隔(:)
例:grep ‘\bx\b’ passwad 寻找 : x : 相匹配的

正则表达式字符组合
6,字符串
‘m…c’
‘[A-Z][a-z]’ '[0-9][0-9]'两个数字相连
grep ‘\b[0-9][0-9]\b’ passwad 查找两位数

字符串组合方式:重复 逻辑
7.1,重复
’ * ‘:零次或多次匹配前面的字符或子表达式
’ +’:一次或多次匹配前面的字符或子表达式
‘?’:零次或一次匹配前面的字符或子表达式
文档text.txt
内容:se seee eeeeee soooo +se+se+
grep ‘se*’ text.txt 匹配:se seee s 重复e 1次,3次,0次
grep ‘se\+’ text.txt 匹配:se seee
grep ‘se\?’ text.txt 匹配:se s
grep ‘\(se\)*’ text.txt 括号在正则中加反斜杠:匹配se 和 空行

7.2.重复特定的次数:{n,m} n重复最小次数,m重复最大次数
‘*’ :{0,}
‘+’ :{1,}
‘?’:{0,1}
grep ‘[0-9]\{2,3\}’ passwad 加反斜杠{}

7.3.任意字符串的表示:.*
例:^r.* ----------- 以r开头的一行
m.*c --------------- m开头c结尾不限长度的字符串
\bm[a-z]*c\bm — m开头c结尾不限长度的字符串中间为字母

7.4.逻辑表示
| : ‘/bin(false|true)’
grep ‘bin/\(false\ | true\)’ passwad
查找结果:bin/false bin/true

正则表达式案例
1,匹配4-10位qq号 ^ [0-9]\{4,10\}$ 加上首尾
2,匹配15或18位身份证号(支持带X的)
开始位不能为零,最后一位数字加X 中间部分为13位或16位
^ [1-9]\([0-9]\{13\})\ | [0-9]\{16\}\)[0-9xX]$
3,匹配密码(由数字,26个字母和下划线组成)
^\w+$
Link之正则表达式及命令 “sed” 和 “awk” 用法

二,sed工具,作用:自动处理文件 分析日志文件 修改配置文件
sed-流处理编辑器,sed–行处理原理,体现:sed一次处理一行内容, sed不改变文件内容(除非重定向),sed–文本处理,操作过程:正则选定 sed处理。
Link之正则表达式及命令 “sed” 和 “awk” 用法

sed格式
1,命令行格式
sed [options] 'command 'file(s)
[options]:参数 -e; -n
command:命令 行定位(正则)+sed命令(操作)
file:要操作的文件
举例:
sed -n ‘/root/p’            -n匹配p打印命令
sed -e ‘10,20d’ -e ‘s/false/true/g’       -e匹配调用两个sed命令

2,脚本格式
sed -f scriptfile file(s)

基本操作命令
1,打印命令p 和 -n匹配使用否则会多次打印
sed -n ‘p’ passwad 打印passwad文件中所有内容

2,定位一行两种方法:x(行号);/pattern/(正则,表达式两边加/)
sed -n ‘10p’ passwad
nl passwad | sed -n ‘10p’      nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!-----打印前10行
sed -n ‘/mooc/p’ passwad       打印passwad文件中含有mooc的行

3,定位多行两种方法:x,y; /pattern/,x;
nl passwad | sed -n ‘10,20p’
nl passwad | sed -n ‘/news/,/mooc/p’
nl passwad | sed -n ‘10!p’     取反,行号后加感叹号
nl passwad | sed -n ‘10,20!p’     取反

4,定位间隔几行 :first ~ step 起始行~步径
nl passwad | sed -n ‘1~2p’ 打印出1,3,5等行

5,基本操作命令2
-a (新增行) /i (插入行)
-c (替代行)
-d(删除行)
nl passwad | sed ‘5a========’           在第五行后边增加====
nl passwad | sed ‘1,5a========’       1到5行增加=====
nl passwad | sed ‘5i========’           插入 在第五行前边插入===
nl passwad | sed ‘40c ksjkdjskd’           把40行替换成
nl passwad | sed ‘35,40c ksjkdjskd’       把35到40行替换成一行ksjkdjskd
nl passwad | sed ‘/mooc/d’          删除一行(文件原文件内容不会被改变,要改变需要进行保存操作)
案例一:优化服务器配置
在ssh配置文件中加入相应文本:
sed ‘$a \     port2222 \n     pedjjddhdjfkd no’ ssh_config
\n表示第二行 , 空格为了和文件内的内容对齐 操作命令a后加\阻隔空格生效

案例二:删除文本中的空行
sed ‘/^$/d’ aa.txt

案例三:服务日志处理
服务器中log找出error日志
sed -n ‘/Error/p’ bb.log

6,基本操作命令3
-s(替换):分隔符/,#等
sed ‘s/false/true/’ passwad 把false替换成true
-g(全局):替换标志 不加只替换第一行的第一个匹配的,
案例四:数据筛选,获取网卡中间ip
ifconfig eth0 | sed -n ‘/inet /p’ | sed ‘s/inet.*r://’|sed ‘s/B . * $//’

sed 高级操作命令
7,-{}:多个sed命令,用 ; 隔开
例:nl passwad | sed ‘{20,30d;s/false/true}’ passwad

8,-n :读取下一个输入行(用下一个命令处理)
sed读入一行处理一行,读到它的模式空间也就是临时缓冲区里
加上n把下一行再次读入,然后再去处理,中间有个跳行的处理
nl passwad | sed -n ‘{n;p}’ 输出2,4,6,8行
nl passwad | sed -n ‘{p;n}’ 输出1,3,5,7行
nl passwad | sed -n ‘{n;n;p}’ 输出3,6,9行

9,-&:替换固定字符串
sed ‘s/^ [a-z_-]\+/& /’ passwad 把原用户名替换成用户名后加空格
案例一:大小写转换
将用户名的首字母转换成大写/小写
10,元字符\u \l \U \L:转换为大写或小写字符
小写的是对首字母字符转换,大写的是对一串字符进行大小写转换
sed ‘s/^ [a-z_-]\+/\u&/’ passwad 用户名首字母大写
将文件夹下的.txt文件文件名换成大写
ls * .txt | sed ‘s/^\w\+/\U&/’
案例三:数据筛选: 获取passwd文档中 USER,UID和GID 字段
sed ‘s/\(^ [a-z_-]\+\) : x : \([0-9]\+\) : \([0-9]\+\) : .*$/USER\1 UID\2 GID\3/’ passwad

11,高级操作命令
-\( \) : 替换某种(部分)字符串(\1,\2)
s/w1\(w2\)w3/\1/
s/w1(w2)(w3)/\1\3/
获取ens33的ip
Link之正则表达式及命令 “sed” 和 “awk” 用法

12,高级操作命令 -rw
-r : 复制指定文件插入到匹配行
-w : 复制匹配行拷贝指定文件里
原文件------>目标文件间的互操作
echo -e ‘1831281083/n387192711982/n9128018201’ >123.txt
echo -e ‘ewqjek/nqwqqeqewq\nqwqeqeqwe’ >abc.txt
sed ‘1r 123.txt’ abc.txt     读入123文件放入abc文件第一行后边
读不改变源文件内容

sed ‘1w abc.txt’ 123.txt    把123的第一行写到abc中—覆盖
sed ‘w abc.txt’ 123.txt      把123的写到abc中—覆盖非追加
写改变文件内容

13,高级操作命令 -q
q : 退出sed
nl passwad | sed ‘10q’      执行到第十行结束命令
nl passwad | sed ‘/false/q’        找到第一个false结束命令
Link之正则表达式及命令 “sed” 和 “awk” 用法
三,awk命令 文本与数据处理工具
可编程----处理灵活,功能强大。作用:统计,制表
awk处理方式,awk一次处理一行内容,awk对每行可以切片处理
$awk ‘{print $1}’ //输出首个单词
使用awk–格式
(一),命令行格式
$awk [options] ‘command’ file(s)
options:参数
command : pattern {awk操作命令}
pattern : 正则表达式;逻辑判断式
{awk操作命令}:内置函数:print() printf() getline…;
控制指令:if(){}else{}; while(){};
(二),脚本格式
awk内置参数应用

1,awk 内置变量1
$0: 表示整个当前行
$1: 每行第一个字段
$2: 每行第二个字段

2,awk内置参数:分隔符
options : -F field-separator(默认为空格)
例如:awk -F ‘:’ ‘{print $3}’ /etc/passwad 打印每行第三个字段
awk -F ‘:’ ‘{print $1,$3}’ /etc/passwad 打印两个字段
awk -F ‘:’ ‘{print “User:”$1"/t "“UUID:”$3}’ /etc/passwad

3,awk内置变量2
NR : 每行的记录号 行号
NF : 字段数量变量 列号
FILENAME : 正在处理的文件名
awk -F ‘:’ ‘{print NR,NF}’ /etc/passwad
案例:显示/etc/passwad中用户ID大于100的行号和用户名(if…else…)
awk -F ‘:’ ‘{if($3>100) print "line: "NR,"USER: " $1}’ passwad
案例三:找出服务器log中发生Error的日期
sed ‘/Error/p’ passwad | awk ‘{print $1}’ passwad
awk ‘/Error/{print $1}’ passwad

4,awk逻辑判断式
awk逻辑
~ , !~ : 匹配正则表达式
==,!=,<,> : 判断逻辑表达式
awk -F ‘:’ ‘$1~/^m . */{print $1}’ passwad
第一个字段以m开头后边匹配任意字符
awk -F ‘:’ ‘$3>100{print $1,$3}’ passwad

5,awk-扩展格式(非基本格式)
$awk [options] ‘command’ file(s)
command2扩展:
BEGIN{print “start”} pattern{commands}END{print “end”}
begin和end不参与pattern处理
案例一:
制表显示passwad每行行号,每行列数,对应行的用户名
awk -F ‘:’ ‘BEGIN{print “Line Col User”} {print NR,NF,$1} END{print “----“FILENAME”-----”}’ passwad

awk 处理过程
案例一:统计当前文件夹下的文件/文件夹占用的大小
ls -l | awk ‘BEGIN{size=0}{size+=$5}END{print “size is " size/1024/1024"M”}’
案例二;统计显示passwd的账户总人数
awk -F ‘:’ ‘BEGIN{cont=0}$1!~/^ $/{count++}END{print "count= "count}’ passwad
案例三:统计显示UID大于100的用户名
awk -F ‘:’ ‘BEGIN{count=0}{if($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}’ passwad

awk和sed对比
awk和sed都可以处理文本
awk侧重于复杂逻辑处理
sed侧重于正则处理
Link之正则表达式及命令 “sed” 和 “awk” 用法