shell文本三剑客

shell脚本文本三剑客

一、sed

grep就是查找文本当中的内容,扩展正则表达式

sed 文本三剑客之二

sed是一种流编辑器,一次处理一行内容。

如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。

一行一行处理,处理完当前行,才会处理下一行。直到文件末尾。

sed的命令格式和操作选项:

sed -e ‘操作符’ -e ‘操作符’ 文件1 文件2

-e 表示可以跟多个操作符,只有一个操作,-e可以省略

sed -e ‘操作符1;操作符2’ 文件1 文件2

选项:

-e :用于执行多个操作命令

-f :在脚本中定义好了操作符,然后根据脚本内容的操作符对文件进行操作

-i :直接修改目标文件(慎用)

-n :仅显示script处理后的结果(不加-n,sed会有两个输出结果,加了-n之后就会把默认输出屏蔽,只显示一个结果)

操作符

p:打印结果

r:扩展正则表达式

s:替换,替换字符串

c:替换,替换指定行

y:替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致

d:删除,删除行

a:增加,指定行的下一行插入内容

i:增加,指定行的上一行插入内容

r:在行后增加文本内容

$a:在最后一行插入新的内容

$i:在倒数第二行插入新的内容

$r:读取别的文件内容在最后一行插入

打印功能

#寻址打印
sed -n '=;p' test
sed -n ‘4p’ test

#打印最后一行
sed -n '$p' test

#行号范围打印
sed -n  #打印2到最后一行
sed -n '2p;$p' test #打印第二行和最后一行

#打印奇数行和偶数行
sed -n 'p;n' test	#奇数行
sed -n 'n;p' test	#偶数行
#n的作用,跳过一行,打印下一行

文本内容进行过滤

#过滤并打印包含o的行
sed -n '/o/p' test

#使用正则表达式对文本内容进行过滤
sed -n '/^root/p' /etc/passwd
#打印以root开头的行
sed -n '/bash$/p' /etc/passwd
#打印以bash为结尾的行

#从指定行开始,打印到第一个以bash为结尾的行
sed -n '3,/bash$/p' /etc/passwd
#扩展正则
#打印出99:至少两次
sed -rn '/(99:){2,}/p' /etc/passwd
*	.*	{n,m}	{n,}	{,m}	?
|	()	+

文本删除

#要么以root为开头,要么以bash为结尾的行
sed -rn '/^root|bash$/p' /etc/passwd

#免交互删除文件内容
sed -i 'd' test1

sed -n '3d;p' test
#删除第三行,打印剩余的行

sed -n '5,$d;p' test
#删除第五行到最后一行

sed -n '1!d;p' test
#除了第一行其他全部删除

sed -n '4,6!d;p' test
sed -n -e '1,3d' -e '5d' -e '7,$d' -e 'p' test
#除了第四行和第六行,其他全部删除

sed -n ‘4d;6d;p’ test
#删除第四行和第六行

sed '/one/,/six/d;p' test

替换

#替换字符串
sed -n 's/root/test/p' /etc/passwd
替换第一个
sed -n 's/root/test/2p' /etc/passwd
替换第二个
sed -n 's/root/test/gp' /etc/passwd
替换所有

#将文本内容注释掉
sed -n 's/^/#/p' test
#将4到6行注释
sed -n '4,6 s/^/#/p' test
#将4和6行注释
sed -n '4 s/^/#/p;6s/^/#/p' test

#首字母变成大写
sed 's/[a-z]/\u&/' test
\u&/ 转换字母大写的特殊符号。\转义符
#所有字母变成大写
sed 's/[a-z]/\u&/g' test
#首字母变成小写
sed 's/[A-Z]/\l&/'	test
\u&/ 转换字母小写的特殊符号。\转义符
#所有字母变成小写
sed 's/[A-Z]/\l&/g'	test

#整行替换
sed '/one/c shuai' test

#单字符替换
sed 'y/one/111' test

#在某一行下添加
sed '/three/a 123' test
#在某一行上添加
sed '/three/i 123' test
#将另外文件的内容加在行后
sed 'three/r test1' test
#在最后一行插入新的内容
sed '$a shuai ' test
#使用sed对字符串和字符的位置进行互换
echo aaabbbccc | sed -r 's/(aaa)(bbb)(ccc)/\3\1\2/'
echo 一二三四五 | sed -r 's/(.)(.)(.)(.)(.)/\5\4\3\2\1/'
#取出版本号
vim mianshi.txt
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar

cat mianshi.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'
#打印指定时间内的日志
tail -f

sed的主要作用就是对文本的内容进行增删改查

其中最好用,最强大的是改和增

二、awk

文本三剑客最后一个命令

awk 按行取列

awk 默认的分隔符,空格或者tab键,多个空格自动压缩成一个

awk的工作原理:根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出

awk的选项

awk -F 指定分隔符 默认是空格

awk -v 变量控制

内置变量

$#:#指的是数字,按行需要取出的第几个字段

$0:打印所有,展示所有内容

NR:需要处理的行号

NF:处理行的字段个数,$NF:当前行的最后一个字段

FS:FS和F是一样的,都是指定分隔符,-F:FS=“:”

OFS:指定输出内容的分隔符

RS:行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行

命令格式:

awk -F '操作符 {动作}‘ 处理对象
-F 指定分隔符,如果是空格可以不加
动作:默认就是打印
#打印行号
awk '{print NR}' test.txt
awk '{print NR,$0}' test.txt

#打印指定行
awk 'NR==3{print}' test1.txt
#打印第三行到第五行
awk
' test1.txt
#打印第三行第五行
awk 'NR==3;NR==5{print}' test1.txt

#奇偶行打印
#偶数行
awk 'NR%2==0{print}' test1.txt
#奇数行
awk 'NR%2==1{print}' test1.txt
#指定分隔符
awk -F: 'NR==1,NR==3{print $3}' /etc/passwd
#awk文本过滤
awk '/root/{print}' /etc/passwd
#awk正则表达式
awk '/^root/{print}' /etc/passwd
awk '/$bsah/{print}' /etc/passwd

#BEGINDA打印模式
awk 'BEGIN{...};{...};END{...}' 文件
BEGIN{...}预先的条件,指定awk命令前的初始化操作
{...}处理条件,如何多初始值进行操作
END{...}处理完之后的操作,一般都是打印

awk 'BEGIN{x=1};{x++};END{print x}' test1.txt

awk 'BEGIN{print 2**3}'
awk 'BEGIN{print 2^3}'
幂运算
BEGIN可以是一次性操作,后面的END是充分不必要的操作

#脚本内用awk传参,要在里面定义,外面定义的参数传不进awk内,-v来进行赋值
a=3
b=4
num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a^b }')
echo $num

echo $PATH | awk -v RS=":" '{print $1}'
awk -v FS=":" -v OFS="==" '{print $1 $3}' /etc/passwd
#使用awk进行条件判断打印
awk -F: '$3>999{print $0}' /etc/passwd
取第三列的值大于999,并打印一整行

awk -F: '!($3>999){print $0}' /etc/passwd
取反第三列的值大于999,并打印一整行

awk -F: '$3==1300{print $0}' /etc/passwd
取第三列的值等于1300,并打印一整行

awk的精确筛选:

$n(<>==)用于比较数值

$n-“字符串” 表示该字段包含某个字符串

$n!~“字符串” 表示该字段不包含某个字符串

$n==“字符串” 表示该字段等于某个字符串

$n!=“字符串” 表示该字段不等于某个字符串

$NF 代表最后一个字段

#打印第七列包含bash 这个字段的行,取得是行的第一列和最后一列,以:作为分隔符
awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd

awk -F: '$7~"bash" {print $1,$2,$3}' /etc/passwd
取列的时候,他没有且或,没有范围的表示方法,只能什么和什么,想打印范围只能老老实实,$出范围

awk -F: '$7!~"bash" {print $1,$2,$3}' /etc/passwd
取反


逻辑关系

逻辑且

#第一列=lx且第七列=/bin/bash
awk -F: '($1=="xy101")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd

逻辑或

#第一列=lx或第七列=/bin/bash
awk -F: '($1=="lx")||($NF=="/bin/bash") {print $1,$NF}' /etc/passwd

curl是一个功能强大的命令

获取和发送数据

curl -O 下载文件到本地

curl -o 将文件下载到指定的路径

curl -i 可以获取web软件的版本(服务端没有隐藏版本号)

curl -x 发送post请求

#取小数点几位以及小数运算怎么去整数
num=$(awk 'BEGIN{printf "%.2f",1.222*2.222}')
#小数运算只取整数
num=$(awk 'BEGIN{printf "%.F",1.222+2.2222}')

三、grep

grep 过滤文本内容

sed 针对文本内容进行增删改查

awk 按行取列

文本三剑客都是按照行进行匹配

grep的作用:使用正则表达式来匹配文本内容

选项:

grep -m 匹配几次之后停止

grep -v 取反

grep -n 显示匹配的行号

grep -c 只统计匹配的行数

grep -o 仅显示匹配的结果

grep -q 静默模式,不输出任何信息

grep -A 数字 后几行

grep -B 数字 前几行

grep -C 数字 前后各几行

grep -e 逻辑或

grep -E 匹配扩展正则表达式

grep -f 匹配两个文件相同内容,以第一个文件为准

grep -r 递归目录 目录下的文件内容。软连接不包含在内

grep -R 递归目录 目录下的文件内容。软连接包含在内

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值