shell三剑客

shell三剑客

sed

sed是一种流编辑器,也是文本处理非常好的工具,配合正则使用更加强大处理时,把当前处理的行存储在临时的缓冲区中,称为“模式空间”,接着sed命令处理缓冲区的内容,完成后输出到屏幕,接着处理下一行。文件内容没有改变,除非使用-i选项。sed主要用来编辑一个或多个文件,简化对文件的反复操作或者用来编写转换程序等。
常用参数

-e  #以指定的指令来处理输入的文本文件
-n  #取消默认输出
-h  #帮助
-V  #显示版本信息

常用命令

a  #在当前行下面插入文本
i  #在当前行上面插入文本
c  #选定的行改为新的文本
d  #删除,删除选择的行
D  #删除模板的第一行
s  #替换指定字符
h  #拷贝模板内块的内容到内存中的缓冲区
H  #追加模板内块的内容到内存中的缓冲区
g  #获得内存缓冲区的内容,并替代当前模板块中的文本
G  #获得内存缓冲区的内容,并追加到当前模板块中的文本的后面
l  #列表不能打印字符的清单
n  #读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N  #追加下一个输入行到模板块后面并在二至间嵌入一个新行,改变当前号码
p  #打印匹配的行
P  #打印模板中的第一行
q  #退出sed
r  #file 从file中读行
w  #file 写并追加模板块到file末尾
W  #file 写并追加模板块的第一行到file末尾#表示后面的命令对所有没有选定的行发生作用
=  #打印当前行号码

Sed替换命令

g  #表示行内全面替换(全局替换配配合s命令使用)
p  #表示打印行
w  #表示把行写入到下一个文件
x  #表示呼唤模板中的文本和缓冲区的文本
y  #表示把一个字符翻译为另外的字符
1  #字串匹配标记
&  #已匹配字符串标记

Sed正则

^    #匹配行开始
$    #匹配行结尾
.    #匹配一个非换行符的任意字符
*    #匹配0或多个字符
[]   #匹配一个范围内的字符
[^]  #匹配一个不在指定范围内的字符
(..) #匹配字串
&    #保存搜索字符中用来替换其他字符
<    #匹配单词的开始
>    #匹配单词的结束
x{m} #重复字符x,m次
x{m,} #重复字符x,至少m次
x{m,n}  #重复字符x,至少m次,不多于n次

Sed实例
1 替换

# echo "hello world" | sed 's/ /-/1g'
hello-world
#从第一个空格开始全局替换成-

2 删除

sed '/^$/d' filename   #删除空白行
sed '2d' filename      #删除第二行
sed '2,$d' filename    #删除第二行到行尾
sed '$d' filename      #删除最后一行
sed '/^test/d' filename #删除以test开头的行

3 匹配替换

echo "hello world" | sed 's/hello/[&]/'
[hello] world
#&表示匹配到的字符串

4 选定范围

sed -n '/= 0/,/max/p' filename
#打印=0到max范围内的行

5 sed多点编辑功能

[root@k8s-master ~]# cat -n test
     1	this is a test file
     2	welcome
     3	to
     4	here
     5	hello WORLD
     6	
     7	linux centos7.4
     8	redhat
     9	
[root@k8s-master ~]# sed -e '2,6d' -e 's/linux centos7.4/Linux CentOS7.4/' test
this is a test file
Linux CentOS7.4
redhat

6 读入写入

[root@k8s-master ~]# cat test1
qwerqwerwqerw
adsfad
zcvzc
test1
hhhh
[root@k8s-master ~]# cat test
welcome
to
here
[root@k8s-master ~]# sed '/to/r test1' test
welcome
to
qwerqwerwqerw
adsfad
zcvzc
test1
hhhh
here
#将test的文件内容读取显示所有匹配to行的后面

[root@k8s-master ~]# sed '/yujilong/w test2' test
welcome
to
here
yujilong
this is test file!

[root@k8s-master ~]# cat test2
yujilong
# 将test文件匹配到yujilong的所有行都写入到test2文件中,文件可以不存在,如果文件存在,就会被重定向

7 追加插入

[root@k8s-master ~]#  sed '/^y/amy age is 22' test
welcome
to
here
yujilong
my age is 22
this is test file!
#在匹配以y开头的行的后面追加my age is 22
[root@k8s-master ~]# sed '1ajiu shi wan' test
welcome
jiu shi wan
to
here
yujilong
this is test file!
#在第一行的后面追加jiushiwan
[root@k8s-master ~]#  sed '/^y/imy name is' test
welcome
to
here
my name is
yujilong
this is test file!
#在匹配以y开头的行的前面插入my name is
#########注意:不使用“-i”选项是不会改变文件内容的
[root@k8s-master ~]# cat test
welcome
to
here
yujilong
this is test file!

[root@k8s-master ~]#  sed -i '/^y/imy name is' test
[root@k8s-master ~]# cat test
welcome
to
here
my name is
yujilong
this is test file!

8 其他

[root@k8s-master ~]# cat test
welcome
to
here
my name is
yujilong
this is test file!
[root@k8s-master ~]# sed '/is/{n;s/y/Y/;}' test
welcome
to
here
my name is
Yujilong
this is test file!
#如果匹配到is就跳到下一行,将小写y替换成大写,注意到最后一行也是被匹配到的,但是后面的条件不满足,所以没有替换
[root@k8s-master ~]# sed '1,4y/e/E/' test
wElcomE
to
hErE
my namE is
yujilong
this is test file!
#将1到4行的所有e替换成E

9 打印奇数或公偶行

[root@k8s-master ~]# cat -n test
     1	welcome
     2	to
     3	here
     4	my name is
     5	yujilong
     6	this is test file!
[root@k8s-master ~]# sed -n 'p;n' test
welcome
here
yujilong
[root@k8s-master ~]# sed -n '1~2p' test
welcome
here
yujilong
#打印奇数行
[root@k8s-master ~]# sed -n '2~2p' test
to
my name is
this is test file!

[root@k8s-master ~]# sed -n 'n;p' test
to
my name is
this is test file!
#打印偶数行

10 打印匹配字符串行的下一行

[root@k8s-master ~]# sed -n '/here/{n;p}' test
my name is
[root@k8s-master ~]# awk '/here/{getline;print}' test
my name is

grep

文本查找或搜索工具。用于查找内容包含指定的范本样式的文本。
常用参数

-a  #不要忽略二进制数据
-A  #除了显示符合范本样式的那一行之外,并显示该行之后的内容
-b  #在显示符合范本样式的那一行之外,并显示该行之前的内容
-B  #除了显示符合样式的那一行之外,并显示该行之前的内容
-c  #计算符合范本样式的列数
-C  #除了显示符合范本样式的那一列之外,并显示该列之前后的内容
-d  #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
-e  #指定字符串作为查找文件内容的范本样式
-E  #将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
-f  #指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式
-F  #将范本样式视为固定字符串的列表
-G  #将范本样式视为普通的表示法来使用
-h  #在显示符合范本样式的那一列之前,不标示该列所属的文件名称
-H  #在显示符合范本样式的那一列之前,标示该列的文件名称
-i  #忽略字符大小写的差别
-l  #列出文件内容符合指定的范本样式的文件名称
-L  #列出文件内容不符合指定的范本样式的文件名称
-n  #在显示符合范本样式的那一列之前,标示出该列的编号
-q  #不显示任何信息
-R/-r #此参数的效果和指定“-d recurse”参数相同
-s  #不显示错误信息
-v  #反转查找
-V  #显示版本信息 
-w  #只显示全字符合的列
-x  #只显示全列符合的列
-y  #此参数效果跟“-i”相同
-o  #只输出文件中匹配到的部分

正则表达式

^  #匹配以xx开头的行
$  #匹配以xx结尾的行

常用实例

#在多个文件中查找
grep "file" file_1 file_2 file_3

#输出除之外的行  -v
grep -v "file" file_name

#使用正则表达式
grep  -E "[1-9]"
egrep "[1-9]+"

#只输出文件中匹配到的部分  -o
echo this is test line. | grep -oE "[a-z]+."

echo this is test line. | egrep -E "[a-z]+."

#统计文件或者文本中匹配字符串的行数 -c
grep -c "text" file_name

#输出包含匹配字符串的行数 -n
grep "file" -n file_name
cat file_name | grep "file" -n

#多个文件
grep "text" -n file_name

#搜索多个文件并查找匹配文件在哪些文件中
grep -l "file" file1 file2 file3

#grep递归搜索
grep "text" . -r -n

#忽略匹配样式中的字符大小写  -i
echo "hello world" | grep -i "HELLO"

#指定多个匹配样式  -e
echo this is a text line | grep -e "is" -e "line"

#显示一行,一个大写字母+四个小写字母+空格+一个大写字母
grep '[A-Z][a-z]{4}:[[:space:]}[A-Z]' testfile

#显示包括kk 的行
grep '[a-z]{1,}[[:space:]][kk]' testfile

#显示6位数字的行,并打印行号
grep -n '[0-9]{6,}$' testfile

awk

对文本和数据进行处理,awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他命令的输出。它在命令行中使用,但更多是作为脚本来使用。

语法格式

awk [options] 'scripts' var=value filename

常用参数

-F 指定分隔符(可以是字符串或者正则表达式)
-f 从脚本中读取awk命令
-v var=value 赋值变量,将外变量传递给awk

脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END { print "end" }' filename

一个awk脚本通常由BEGIN语句+模式匹配+END语句三个部分组成,这三个部分都是可选项
工作原理:

  • 第一步执行BEGIN语句
  • 第二步从文件或标准输入读取一行,然后再执行行pattern语句,逐行扫描文件到文件全部被读取
  • 第三步执行END语句
[root@k8s-master ~]# echo "hello" | awk 'BEGIN{ print "welcome" } END{ print "this is test of awk"}'
welcome
this is test of awk
[root@k8s-master ~]# echo  "hello" | awk 'BEGIN{ print "welcome" } {print}  END{ print "this is test of awk"}'
welcome
hello
this is test of awk
#不加print参数时默认只打印当前的行

[root@k8s-master ~]# echo | awk '{ a="hello"; b="nihao"; c="yujilong";print a,b,c; }'
hello nihao yujilong
#使用print逗号分隔时,打印则是以空格分界
[root@k8s-master ~]# echo | awk '{ a="yjl"; b="yuji"; c="yujilong";print a" is "b" or "c; }'
yjl is yuji or yujilong
#awk的print语句中双引号其实就是个拼接作用

awk变量
内置变量

$0     #当前记录
$1~$n  #当前记录的第N个字段
FS     #输入字段分隔符(-F作用相同)默认空格
RS     #输入记录分隔符,默认换行符
NF     #字段个数;列
NR     #行号;默认从0开始
OFS    #输出字段分隔符,默认空格
ORS    #输出记录分隔符,默认换行符

外部变量

[root@awk ~]# a=100
[root@awk ~]# b=200
[root@awk ~]# echo | awk '{print v1*v2}' v1=$a v2=$b
20000

awk运算与判断
算术运算符

+ -  加减
* / & 乘 除 取余
^ * 求幂
++ --  增加或减少 
[root@awk ~]# awk 'BEGIN{a="b";print a,a++,a--;++a;}'
b 0 1
[root@awk ~]# awk 'BEGIN{a="b";print a,a++,a--,++a;}'
b 0 1 1
[root@awk ~]# awk 'BEGIN{a="0";print a,a++,a--,++a;}'
0 0 1 1
[root@awk ~]# awk 'BEGIN{a="0";print a,a++,--a,++a;}'
0 0 0 1
#和其他变成语言一样,所有用运算符进行操作,操作数自动转为数值,所有非数值都变为0

赋值运算符

= += -+ *= %= ^= **=

正则运算符

~ !~  #匹配正则表达式/不匹配正则表达式

逻辑运算符

|| && 逻辑或 逻辑与

关系运算符

< <= > >= != =

其他运算符

$      #字段引用 
space  #字符串链接符
?:     #三目运算符
ln     #数组中是否存在某键值

awk正则

^      #行首定位符
$      #行尾定位符
.      #匹配任意单个字符
*      #匹配0个或多分前导字符
+      #匹配1个或多个前导字符
?      #匹配0个或1个前导字符
[]     #匹配指定字符组内的任意一个字符
[^]    #匹配不在指定字符组内的任意一个字符 
()     #子表达式
|      #或者
\      #转义符
~,!~   #匹配或者不匹配
x{m}   #x字符重复出现m次
x{m,}  #x字符至少重复出现m次
x{m,n} #x字符至少重复m次但不超过n次

awk实例介绍

awk -F : '{print $2}' test
#以:分隔打印第二列

awk -F : '/^dae/{print $2}' test
#以:分隔符打印dae开头的第二列内容

awk -F : '/^[ac]/{print $2}' test
#以:分隔符打印以a或c开头的第二列内容

awk -F : '{if(length($1) == 4) print $1}' test
#打印以:分隔且第一个字段长度为4的第一列

awk -F : '/[24]/{print $1}' test
#匹配24的行以:分隔打印第一列

awk -F : '/^dae/{print ”a“$2}' test
#以:分隔符打印dae开头的第二列并且在前面加上a

awk -F : '($4 == 996) {print $1} ' test
#以:分隔符打印第四列式996的行的第一列

awk -F : '($1 == "root") {print $1}' test
awk -F : '$1~/root/ {print $1}' test
#打印以:分隔且第一列为root的第一列内容

ll | awk 'BEGIN {size=0;} {size=size+$5;} END{print "[END]size is",size/1024/1024,"M"}'
#统计目录个的文件所有字节数

awk 'BEGIN{a=10;a+=10;print a}'
#a+10等价于a=a+10

[root@awk ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[root@awk ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err
#三目运算

awk '/root/{print $0}' test
#匹配所有包含root的行

awk -F : '$5~/root/{print $0}'  test
awk -F : '($5 == "root"){print $0}'  test
#以分号作为分隔符,匹配第5个字段是root的行

ifconfig ens33 | awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $3}'
#打印IP地址


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值