正则表达式grep、sed、awk

什么是正则

正则就是一串有规律的字符串
掌握好正则对于编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样的

grep

grep [-cinvABCE] 'word' filename
-c 行数 
-i 不区分大小写
-n 显示行号
-v 取反
-A 后面加数字n,过滤出符合条件的行及其下面n行
-B 同上,过滤出符合条件的行及其上面n行
-C 同上,同时过滤出符合条件的行及其上下各n行
-E 支持正则表达式

示例:
grep -n 'root' /etc/passwd
grep -nv 'nologin' /etc/passwd
grep '[0-9]' /etc/passwd
grep -v '[0-9]' /etc/passwd
grep -v '^#' test.txt
grep -v '^#' test.txt | grep -v '^$'
grep '^[^a-zA-Z]' test.txt
grep 'r.o' test.txt
grep 'oo*' test.txt
grep '.*' test.txt
grep 'o\{2\}' /etc/passwd
egrep 'o{2}' /etc/passwd
egrep 'o+' /etc/passwd
egrep 'oo?' /etc/passwod
egrep 'root|nologin' /etc/passwd
egrep '(oo){2}' /etc/passwd

sed

sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用

命令  功能

a\  在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
d   删除行
h   把模式空间里的内容复制到暂存缓冲区
H   把模式空间里的内容追加到暂存缓冲区
g   把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G   把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l   列出非打印字符
p   打印行
n   读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q   结束或退出sed
r   从文件中读取输入行
!   对所选行以外的所有行应用命令
s   用一个字符串替换另一个
g   在行内进行全局替换
w   将所选的行写入文件
x   交换暂存缓冲区与模式空间的内容
y   将字符替换为另一字符(不能对正则表达式使用y命令)

常见命令参数

p 打印到屏幕上
d 去掉匹配的内容
-n 取消默认的完整输出,只要需要的  
-e 允许多项编辑
-i 修改文件内容
-r 支持正则表达式

示例

sed '1'd test.txt
sed '1,3'd test.txt
sed '/oot/'d test.txt
sed '1,2s/ot/to/g' test.txt
sed 's/[0-9]//g' test.txt
sed 's/[a-zA-Z]//g' test.txt
sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' test.txt
sed 's/^.*$/123&/' test.txt
sed -i 's/ot/to/g' test.txt
sed -n '5'p test.txt
sed -n '1,5'p test.txt
sed -n '1,$'p test.txt
sed -n '/root/'p test.txt
sed -n '/^1/'p test.txt
sed -n 'in$'p test.txt
sed -n '/r..o/'p test.txt
sed -e '1'p -e '/111/'p -n test.txt

AWK

awk和sed一样,一次处理一行内容;也可以对每行进行切片处理

命令行格式
 awk [options] 'command' files
    command 由两部分组成,分别是
  1、pattern,可以是正则表达式或者逻辑判断式
  2、{ awk 命令 }    花括号括起来的是代码段

awk内置变量及其含义

$0	当前记录(整行的记录)
$1~$n	当前记录的第几列
FILENAME	输入的文件名称
FS	输入文件的字段分隔符(Fields Separator)
RS	输入文件的记录(每一行之间)的分隔符(Record Separator)
NF	当前行的字段数目(Number of Fields)
NR	当前记录所在的行号
OFS	输出字段的分隔符
ORS	输出记录的分隔符

awk函数
 
函数声明	含义
length(str)	返回str中字符的个数
int(num)	返回num的整数部分
index(str1, str2)	返回str2在str1中的索引,如果不存在就返回0
split(str, arr, separator)	使用separator作为分隔符,将str切分为数组保存到arr中,返回数组的元素个数
printf(fmt, args)	根据fmt格式化args,并输出结果
sprintf(fmt, args)	根据fmp格式化args,并返回格式化后的字符串
substr(str, pos, len)	返回str中从pos开始,长度为len个字符的子字符串
tolower(str)	返回str转换为小写字母后的副本
toupper(str)	返回str转换为大写字母后的副本

示例

head -n2 test.txt | awk -F ':' '{print $1}'
head -n2 test.txt | gawk -F ':' '{print $0}' 
awk -F ':' '{print $1,$2,$3}'  test.txt
awk -F ':' '{print $1#$2#$3}'  test.txt 
awk '/oo/' test.txt
awk -F ':' '/root/ {print$1,$3} /test/ {print $1,$3}' test.txt
awk -F ':' '$3=="0"' /etc/passwod
awk -F ':' '$3>="500"'  /etc/passwod
awk -F ':' '$3>=500'  /etc/passwod
awk -F ':' '$7!="/sbin/nologin"' /etc/passwod
awk -F ':' '$3<$4' /etc/passwd
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
head -5 /etc/passwd | awk -F ':' '{OFS="#"} {print $1,$3,$4}'
awk -F ':' '{OFS="#"}{if($3>1000){print $1,$2,$3,$4}}' /etc/passwd
head -n3 /etc/passwd | awk -F ':' '{print NF}'     打印列数
head -n3 /etc/passwd | awk -F ':' '{print NR}'     打印行数
awk -F ':' 'NR>20' /etc/passwd   打印行编号大于20的行
awk -F ':' 'NR<20 && $1 ~ /roo/'  /etc/passwd   打印行编号小鱼20且第一段匹配roo的行
head -n3 1.txt | awk -F ':' '$1="root"'  #一个=号表示第一段赋值为root
awk -F ':' '{tot=tot+$3};{print tot}' 1.txt
awk -F ':' '{if ($1=="root"){print $0}}' 1.txt

转载于:https://my.oschina.net/u/3954059/blog/3093689

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值