文本处理:grep awk sed
grep
grep:全局正则表达式搜索然后打印 cat 名 | grep 搜索名
正则表达式:普通正则表达式 扩展正则表达式
正则表达式是用约定好的某些符号去表示某个含义
.表示任意一个字符 * 前面一个字符出现0次或多次 跟shell通配符区分
[abc] 中括号内的任意一个字符 [^abc] 非中括号内的任意字符
[0-9] 数字
[a-z] 小写字母
[A-Z] 大写字母
[a-zA-Z] 所有字母
[a-zA-Z0-9] 所有字母+数字
[^0-9] 非数字
^xx 以什么开头的
xx$ 以什么结尾的
cat jsetc |grep ‘^$’ #直接回车,一个字符都没有
正则字符当成普通字符使用\,加反斜杠
cat /tmp/jsetc|grep ‘.’
? 前面字符出现0或者1次
cat /tmp/jsetc |egrep ‘jsetc1?’
前面字符出现1或者多次
cat /tmp/jsetc |egrep ‘jsetc1+’
grep仅仅打印匹配,不打印整行
cat /tmp/jsetc | grep -o ‘jsetc.’
统计字符n的数量有多少个
cat /tmp/jsetc |grep -o n|wc -l
{n} 前面字符匹配n次
{a,b} 前面字符匹配a到b次
grep打印出上下文
cat /tmp/jsetc | grep ‘name’
前一行 cat /tmp/jsetc | grep -A 1 ‘name’
后一行 cat /tmp/jsetc | grep -B 2 ‘name’
前后各一行 cat /tmp/jsetc | grep -C 2 ‘name’
grep递归查找 grep -r ‘transmission’ /etc/
awk
把文件逐行的读入,以空格为默认分隔符将每行切片
$0 整行
$1 第一列
$2 第二列
$n 第n列
$NF 最后一列
cat /tmp/jsetc |awk ‘{print $NF}’
NR 当前处理到第几行
cat /tmp/jsetc |awk ‘{print NR}’
awk打印多列、字符串拼接
打印多列,默认中间加空格:
cat /tmp/jsetc |awk ‘{print $1,$2}’
拼接:
cat /tmp/jsetc |awk ‘{print "name is “$1”, "“age is “$2”.”}’
awk针对列过滤,字符串比较
cat /tmp/jsetc |awk ‘$3 == “hangzhou”’
awk的BEGIN、END
BEGIN{}大括号里: 只运行一次,在文本处理开始前运行
{}大括号里: 针对每一行进行处理
END{}大括号里: 只运行一次,在文本处理结束后运行
cat /tmp/jsetc |awk ‘{print $1}BEGIN{print “begin”}END{print “end”}’
awk使用-F指定分隔符
默认分隔符是以多个空白字符作为分隔:空格、tab
-F参数可指定分隔符,后面跟正则表达式,支持扩展正则cat /tmp/jsetc |awk -F’:’ ‘{print $3}’
awk多个单字符分隔
cat /tmp/jsetc |awk -F’[:;]’ ‘{print $3}’
cat /tmp/jsetc |awk -F’?;’ ‘{print $3}’
awk传参
cat /tmp/jsetc |awk -v age=30 ‘$2>age{print $0,age}’
awk的判断例子
cat /tmp/jsetc |awk ‘{ if($2>30){print $0} }’
正则判断条件:str1 ~ /str2/
cat /tmp/jsetc |awk ‘{ if($3~/^hang/){print $0} }’
awk循环语法
for(i in 数组变量){
print i,数组变量[i]
}
array[0]++相当于
array[0] = array[0] + 1
awk的数组
awk ‘BEGIN{ array[0]=2; array[1]=4; array[2]=6; for(i in array){print i,array[i]} }’
awk统计每个城市出现的次数
cat /tmp/jsetc |awk ‘{ count[$3]++ }END{for(city in count){print city,count[city]} }’
sed
sed命令可对文本进行更改、删除、添加、打印,可以直接修改文本文件
sed语法
sed ‘过滤+动作’ 文件路径
sed过滤
默认无过滤,每一行都处理
/^Port/ #正则过滤Port
2,$ #指定行数,n代表第n行,$代表最后一行
/PermitRootLogin/,/ListenAddress/ #包含PermitRootLogin的行开始,包含ListenAddress的行结束
sed动作
p 打印动作
a 在行下面添加
i 在行上面添加
d 删除
s/str1/str2/g 全局查找替换,str1替换成st2
s/str1/str2/ 查找替换,每行第一次出现的替换
sed添加文本
cat /tmp/jsetc.txt | sed ‘a jsetc’ #行后增加
cat /tmp/jsetc.txt | sed ‘i jsetc’ #行前增加
cat /tmp/jsetc.txt | sed ‘a \ jsetc’ #需要增加空格,使用反斜杠
cat /tmp/jsetc.txt|sed ‘/sedsedsed/a \ jsetc add’ #过滤加动作
sed打印动作,跟-n结合使用
cat /tmp/jsetc.txt | sed -n ‘/^Port/p’
cat /tmp/jsetc.txt | sed -r -n ‘/^Port+/p’ #sed默认不支持扩展正则,sed -r
cat /tmp/jsetc.txt |sed -n ‘3,$p’
cat /tmp/jsetc.txt |sed -n ‘/PermitRootLogin/,/sed/p’
sed删除
cat /tmp/jsetc.txt |sed ‘/^Port/d’ #过滤后删除
sed普通替换
cat /tmp/jsetc | sed ‘s/22/1111/g’ #全局替换
cat /tmp/jsetc | sed ‘s/22/1111/’ #每行第一次出现替换
sed过滤加替换
cat /tmp/jsetc | sed ‘1,2s/22/1111/g’ #过滤加替换
cat /tmp/jsetc | sed ‘/^Port/s/Port/PORT/g’ #正则过滤加替换
sed支持直接更改文本文件,使用-i选项
sed ‘s/22/1111/g’ /tmp/jsetc
sed -i ‘s/22/1111/g’ /tmp/jsetc
sed -i ‘/PermitRootLogin/a PermitJsetc’ /tmp/jsetc