shell的三剑客

1 篇文章 0 订阅
1 篇文章 0 订阅

正则表达式
前言:
1、名词解释
正则表达式是一种字符模式,用于在查找过程中匹配指定的字符,在大多数程序里,正则表达式都别置于两个斜杠之间,例如/l[oO]ve/就是由正斜杠界定的正则表达式。它将匹配被查找的行中任何位置出现的相同的模式。在正则表达式中, 元字符是最重要的概念。
2、使用的工具
被vim sed awk grep 调用
3、场景
mysql、oracle、php、python ,Apache,Nginx… 需要正则
4、回顾
示例1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
元字符介绍:元字符是这样一类字符,它们表达的是不同于字面本身的含义。
基本正则表达式:
在这里插入图片描述
下面我们用示例看一下怎么使用的。
行首定位符
在这里插入图片描述
行尾定位符
在这里插入图片描述
匹配任意单个字符
在这里插入图片描述
在这里插入图片描述
匹配前导符0到多次
在这里插入图片描述
任意多个字符
在这里插入图片描述
指定范围内的一个字符
在这里插入图片描述
匹配指定范围内的一个字符
在这里插入图片描述

匹配不在指定范围内的字符
在这里插入图片描述
用来转移字符,脱意符
在这里插入图片描述
词尾个词首定位符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 匹配1-n个前导符
    在这里插入图片描述
    ? 匹配0-1个前导符
    在这里插入图片描述
    组字符
    在这里插入图片描述

/.*/ 搜索所有行
/^ / 空 行 / [ A − Z ] . . /空行 / ^ [A-Z].. //[AZ]../以一个大写字符开头,任意两个字符结尾的
/ ^ [A - Z][a-z ]3[0-5]/ 以大写字母开头,0到多个小写字母或空格,一个三,最后是0-5中的一个数字
/[a-z]
…/ 0到多个小写字母,点 ,以任意字符结尾的
/^ *[A-Z][a-z][a-z] / 以 0 个 或 多 个 空 格 开 头 , 一 个 大 写 字 母 , 一 个 小 写 字 母 , 以 小 写 字 母 为 结 尾 的 字 符 / [ A − Z a − z ] ∗ [ , ] [ A − Z a − z ] ∗ / 以0个或多个空格开头,一个大写字母,一个小写字母,以小写字母为结尾的字符 /^[A-Za-z]*[^,][A-Za-z]* /0/[AZaz][,][AZaz]/ 0到多个大写或小写的字母开头,非逗号,以0到多个大写或者小写字母结尾
/<fourth>/ 找 fourth 这个单词
/<f.th>/ 找f 中间所有字符th结尾的单词
/5{2}2{3}./ 两个五三个二
/1
KaTeX parse error: Expected group after '^' at position 18: … 0到多个空格和tab的行 /^̲#/ #号开开… s/([Oo]ccur)ence/\1rence/ 修改内容。
:1,$ s/(square) and (fair)/\2 and \1/ 替换位置

在grep中,egrep 是扩展支持正则,\w 所有字母与数字,称为字符[a-zA-Z0-9]
\W 所有字母与数字之外的字符,称为非字符,\b 词边界。
fgrep 是不支持正则。
当调用grep时,返回值为0时,是成功,1是没有成功,2是路径不对。

grep -q 不显示在屏幕上
grep -v 取反
grep -R 可以查找目录下面的文件
grep -o 只找到这个关键字就可以了
grep -B2 查找内容的前两行
grep -A2 查找内容的后两行
grep -C2 查找内容的上下两行
grep -l 只要文件名
grep -n 带行号

示例

grep -E 或 egrep 进行使用
# egrep ‘NW’ datafile
在datafile文件中,找NW
# egrep ‘NW’ d*
找NW,文件只要是d开头就可以
# egrep ‘^n’ datafile
以n开头的
# egrep ‘4$’ datafile
4结尾
# egrep TB Savage datafile
找TB,在savage里找,在datafile里找
# egrep ‘TB Savage’ datafile
找TB Savage
# egrep ‘5…’ datafile
找五点后面是一个任意字符
# egrep ‘.5’ datafile
找点五
# egrep ‘2’ datafile
W或E开头
# egrep ‘[^0-9]’ datafile
不是0到9
# egrep ‘[A-Z][A-Z] [A-Z]’ datafile
俩大写,空格,大写的行
# egrep 'ss* ’ datafile
s开头,0到多个s
# egrep ‘[a-z]{9}’ datafile
小写字母出现9次
# egrep ‘<north’ datafile
单词开头
# egrep ‘<north>’ datafile
就找这个词
# egrep ‘<[a-r].n>’ datafile
a或r开头,中间任意,n结尾
# egrep '^n\w
\W’ datafile
n开头,多个字母,结尾一个非字母
# egrep ‘\bnorth\b’ datafile
就找north
# egrep ‘NW|EA’ datafile
NW或者EA
# egrep ‘3+’ datafile
1个或多个3
# egrep ‘2.?[0-9]’ datafile
2开头,0个或1个点,一个数字
# egrep ‘(no)+’ datafile
一个或多个no
# egrep ‘S(h|u)’ datafile
sh或su
# egrep ‘Sh|u’ datafile
sh或者u

sed

sed 返回值不管对错都是0,所以不能作为判断程序运行的对错。具体使用命令:
删除命令是 d : sed -r ‘/root/d’ passwd 删除范围内带有root的行
在这里插入图片描述
在这里插入图片描述
删除第三行:sed -r ‘3d’ passwd
在这里插入图片描述
删除最后一行:
在这里插入图片描述
sed -r ‘3{d;}’ passwd
{存放sed的多个命令} 3{h;d},h暂存空间
在这里插入图片描述
替换命令 s :
sed -r ‘s/root/aofa/’ passwd 替换带有root的行
在这里插入图片描述

sed -r ‘s/root/aofa/g’ passwd 全局替换
在这里插入图片描述
sed -r ‘s/[0-9][0-9]$/&.5/’ passwd 修改 以数字,数字结尾的两位数并且修改为 “.5”

在这里插入图片描述

sed -r ‘s/(mail)/E\1/g’ passwd //在有mail行的mail前增加一个大E,全局

在这里插入图片描述
读取文件 r
在这里插入图片描述
在这里插入图片描述

sed -r ‘1,5w 123.txt’ passwd //复制1到5行

在这里插入图片描述
追加命令 a
sed -r ‘2a123’ passwd 在第二行后追加123
在这里插入图片描述
插入命令 i 是在第几行之前插入
在这里插入图片描述
在这里插入图片描述
替换命令 c
在这里插入图片描述
获取下一个命令:n
在这里插入图片描述
反向选择 :!
在这里插入图片描述
暂存空间 :hHgG
sed -r ‘1h;$G’ passwd
在这里插入图片描述

sed -r ‘1h;2G;3G;$G’ passwd
在这里插入图片描述

sed -r ‘1{h;d};$G’ passwd

在这里插入图片描述

sed -r ‘1h;2,$g’ passwd

在这里插入图片描述

sed -r ‘1h;2,3H;$G’ passwd

在这里插入图片描述

删除文件中的注释行:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
awk简介:
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Peter Weinberger、 Kernighan。
AWK的工作原理:
awk -F: ‘{print $1,$3}’ /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束
(2)然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,最多达100个字段
(3)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕。
awk 的语法结构:
awk 选项 commant 文件名
awk的内部变量:
FS :输入字段分隔符
在这里插入图片描述
OFS :输出字段分隔符
在这里插入图片描述
RS和ORS :输入和输出行分隔符,默认换行符。
在这里插入图片描述
在这里插入图片描述
FNR和NR :多文件独立编号。
NF :末尾。
在这里插入图片描述
格式化输出
1、print 函数
在这里插入图片描述
2、printf 函数
在这里插入图片描述
模式(正则表达)和动作
1、简介
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。
2、字符串比较
在这里插入图片描述
数值比较:比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,
用于比较数字与字符串。
关系运算符: - + * / % ^(幂) >=<
在这里插入图片描述
多条件 :
在这里插入图片描述
在这里插入图片描述
范围查找:
在这里插入图片描述
awk 脚本编程
1、awk调用变量
在这里插入图片描述
2、自定义变量
在这里插入图片描述
条件&判断
在这里插入图片描述
在这里插入图片描述
循环 while
在这里插入图片描述
打印十次
在这里插入图片描述
for循环打印
在这里插入图片描述

打印四次
在这里插入图片描述
数组
在这里插入图片描述
#awk ‘/west/’ datafile 匹配west
# awk ‘/^north/’ datafile 以north开头
# awk ‘$3 ~ /^north/’ datafile 第三列 匹配 north开头的
# awk ‘/^(no|so)/’ datafile no或者so 开头
# awk ‘{print $3,$2}’ datafile 打印第23列,逗号引用分隔符。默认引用OFS=" "
# awk ‘{print $3 $2}’ datafile 打印第2列和第3列,没有分隔符
# awk ‘{print $0}’ datafile 打印所有,默认整行
# awk ‘END {print "Number of fields: "NF}’ datafile 格式化文字“字段数”:列数
# awk ‘/northeast/{print $3,$2}’ datafile 匹配north行的第3,2列
# awk ‘/E/’ datafile 匹配包含E的所有行
# awk ‘/3/{print $1}’ datafile 以n或s开头行的第一列
# awk ‘$5 ~ /.[7-9]+/’ datafile 第五列 匹配 .1到多个7,8,9的行
# awk ‘$2 !~ /E/{print $1,$2}’ datafile 第二列 中不包含E的行,打印第1,2列。
# awk ‘$3 ~ /^Joel/{print $3 " is a nice boy."}’ datafile 在第三列中匹配 以Joel开头的行,打印行中的第3列
# awk ‘ 8   / [ 0 − 9 ] [ 0 − 9 ] 8 ~ /[0-9][0-9] 8 /[09][09]/{print $8}’ datafile 匹配第八列,两个数字结尾,打印第八列
# awk ‘ 4   / C h i n 4 ~ /Chin 4 /Chin/{print “The price is $” $8 “.”}’ datafile 在第四列中 匹配 Chin结尾的字段, 格式化文字加第八列带个点
# awk ‘/Tj/{print $0}’ datafile 匹配Tj的行
# awk -F: ‘{print $1}’ /etc/passwd 冒号分割打印第一列
# awk -F"[ :]" ‘{print NF}’ /etc/passwd 以冒号或空格作为字段分隔符 ,并打印最后一列数
# awk -F"[ :]+" ‘{print NF}’ /etc/passwd 以1到多个冒号或空格作为字段分隔符 ,并打印列数
# awk ‘$7 == 5’ datafile 打印第七列是5 的行
#awk ‘$2 == “CT” {print $1, $2}’ datafile 打印第二列是CT的行的第1,2列
# awk ‘$7 != 5’ datafile 打印第七列不等于5的行
# awk ‘$7 < 5 {print $4, $7}’ datafile 打印第七列小于5的行
# awk ‘$6 > .9 {print $1,$6}’ datafile 打印第6列大于.9的行的第1,6列
# awk ‘$8 <= 17 {print $8}’ datafile 打印第八列小于等于17的行的第八列
# awk ‘$8 >= 17 {print $8}’ datafile 打印第八列大于等于17的行的第八列
# awk ‘$8 > 10 && $8 < 17’ datafile 第八列大于10,并小于17的行。
# awk ‘$2 == “NW” || $1 ~ /south/ {print $1, $2}’ datafile 第二列有NW,或者,第一列包含south的行,只打印第1,2列
# awk ‘!($8 == 13){print $8}’ datafile 第八列不等于13,打印匹配行的第八列($8!=13)
# awk -F":" ‘/root/ {print $3 + 10}’ /etc/passwd 匹配root字段,第三列+10并打印。
# awk ‘/southem/{print $8 + 10}’ datafile 匹配southerm,打印第八列+10
# awk ‘/southem/{print $5 + 10.56}’ datafile 匹配southerm,打印第5列+10.56
# awk ‘/southem/{print $8 - 10}’ datafile 匹配southerm,打印第八列-10
# awk ‘/southem/{print $8 / 2 }’ datafile 匹配southerm,打印第八列除以2
# awk ‘/southem/{print $8 / 3 }’ datafile 匹配southerm,打印第八列除以3
# awk ‘/southem/{print $8 * 2 }’ datafile 匹配southerm,打印第八列乘以2
# awk ‘/southem/{print $8 % 2 }’ datafile 取余数
# awk ‘$3 ~ /^Suan/ {print "Percentage: "$6 + .2 " Volume: " $8}’ datafile 第三列正则匹配以Suan开头的,打印第6列加0.2 并且打印第八列
# awk ‘/western/,/eastern/’ datafile 从以westem开头到以eastem开头的行
# awk ‘{print ($7 > 4 ? "high "$7 : "low "$7)}’ datafile //三目运算符 a?b:c 条件?成立结果1:不成立结果2第三列小于4显示high$7第三列大于4显示low$7
# awk ‘$3 == “Chris” {$3 = “Christian”; print $0}’ datafile 赋值运算符,$3=christian
awk -F":" ‘$3 == 0 {$3=“chaoji”;print $0}’ /etc/passwd
root x chaoji 0 root /root /bin/bash
# awk ‘/Derek/ {$8+=12; print $8}’ datafile 匹配Derek的行,为$8列赋值,$8=$8+12,再打印出$8
# awk ‘{$7%=3; print $7}’ datafile //$7 %= 3等价于$7 = $7 % 3 先将第七列取余,再赋值给第七列,打印第七列


  1. \t ↩︎

  2. we ↩︎

  3. ns ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值