shell脚本(二)之 文本三剑客

 A正则表达式

grep -E   拓展正则表达式

元字符

.  匹配任意单个字符,可以是一个汉字

[]  匹配指定范围内的任意单个字符   可以固定死,也可以表示范围

[^]匹配指定范围外的任意单个字符  [^hao]

常见字符

[:alnum:] : 字母和数字

[: alpha ] :    同时代表英文大小写字符   [A-Z],[a-z]

[:lower:] :     小写字母     [[:lower]]

[:space:]:     包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白

表示次数

*# 匹配前面的字符任意次,

.*  任意长度的任意字符,不包括0次

\?  匹配之前出现的字符0次或1次   及可有可无

\+  匹配之前的字符至少一次  及 >=1

\{n\} 匹配前面的字符 n次

\{m,n\}  匹配前面的字符最少m次最多n次

\{,n\}匹配前面的字符最多n次

\{m,\}  匹配前面的字符至少n次

[root@localhost ~]# echo google |grep 'go\{2\}gle'
#带表前面的o出现2次
google
[root@localhost ~]# echo gooooogle |grep 'go\{2,\}gle'  
#带表前面的o出现2次以上
gooooogle
[root@localhost ~]# echo gooooogle |grep 'go\{2,5\}gle'
#带表前面的o出现2次以上5次以下
gooooogle
[root@localhost ~]# echo goooooogle |grep 'go\{2,5\}gle'
[root@localhost ~]# 
[root@localhost ~]# echo goooooogle |grep 'go*gle'    

位置锚定

^  行首锚定  用于模式的最左侧

$ 行尾锚定   用于模式的最右侧

^PATTERN  用于模式匹配整行  (单独一行只有root)

^$  空行

^[[:space:]]*$  空白行

\< 或 \b       词首锚定,用于单词左侧

\> 或 \b       词尾锚定   用于单词右侧

\<PATTERN>               匹配整个单词

分组或其他

以()将多个字符捆绑起来,当作一个整体处理

grep命令总结

grep  选项  条件  路径

-i  : 忽略大小写

-v : 反向查找。取反  输出内同不包括选取内容

-c      统计与所规定条件相符的行数

-o      只显示匹配到的字符串

-q       不输出内同  静默模式

-A       after  除了显示匹配行还显示其后n行   如grep -A3  及为显示匹配项后三行

-B       defore 显示包括匹配项  和其后n行  grep -B3  显示匹配项和其后三行

-e        实现多个选项间的或者的关系

-w       匹配整个单词

-r         递归查找,不处理软连接

awk的基础用法

格式

awk   [选项]  ‘条件’  {处理动作  常见为print}

选项

-F   指定分隔符

-v    自定义变量

基础用法

print  动作 

awk  ‘{print}’      无特殊处理   打印一边

print打印顺序:'BEGIN{print "1"} END {print  "2"}  {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3  最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印

 awl ‘{print "hello"}’

 awk常见内置变量

FS:   指定分隔符,默认为空格或制表符,与-F作用相同格式为  -v   FS=

OFS:   指定输出时的分隔符

NF:   当前处理的行的字段个数

NR:     当前处理的行的行数(序号)

$0:      当前处理的行的整行内容

$n       当前处理行的地n段(第n列)

FILENAME:被处理的文件名

RS:     行分隔符。

示例

-F

            OFS

NR

行号 

当前梳理的行号

示例

 

如指定打印数/etc/passwd中第三行中用户的bash类型

 打印出文件5-10行的内容  

 NF:当前处理的行的字段个数即处理行有多少列,默认按空格分列,可指定。

 

 

其中$0 为输出当前处理的整行的内容  如单独出现则可看作打印全文

$n 及指定处理第几列

RS行分隔符  

行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是为换行

sed

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。

 一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快

sed基本用法

sed  选项     ‘脚本自身语法’     [其他处理需求,   支持标准输入管道]

常用选项

  1. -n 关闭自动打印   在未关闭情况下会在筛选玩所需内容后再打印全文
  2. -e 多点编辑  即可以同时对文本多个所需处理的字段进行处理
  3. -f FILE 从指定文件中读取编辑脚本
  4. -r, -E 使用扩展正则表达式
  5. -i.bak 在需要对源文件进行修改时使用  加入选项在进行替换等操作时会直接对源文件进行修改  在对重要文件进行此类操作时最好先进行备份
  6. -s  将多个文件视为独立文件,而不是单个连续的长文件流

sed
sed不能作为一个单独的命令来使用   会报错     需要配合后续选项进行使用

sed '  ' 
系统默认此模式为打印所输入的内容
aaa
aaa
ccc 
ccc

sed ' ' /etc/passwd
此为显示文件内同
sed ' ' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...

sed 支持重定向
如sed ' ' < /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 14 18:45:42 2023
...

sed 同样给支持管道符

sed脚本格式

指定的行,$:最后一行,需要结合选项和命令进行匹配

 

 #,#     #从#行到第#行,3,6 从第3行到第6行


   #,+#   #从#行到+#行,3,+4 表示从3行到第7行

/pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间所有的行

sed -n '/^b/,/^f/p' /etc/passwd
'/表达式1/,/表达式2/p' (不要忘记打印)p  文件名

bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

面试题

让你查找几点几分到几点几分之间的日志

sed -n '/2023:12:09/,/2023:22:25:45/p' /var/log
表示奇数或偶数
[root@localhost ~]seq 10|sed -n '1~2p'
1
3
5
7
9
[root@localhost ~]seq 10|sed -n '2~2p'
2
4
6
8
10
[root@localhost ~]seq 10|sed -n '3~3p'
3
6
9
-d选项删除
[root@localhost ~]seq 10 |sed '5d'
将第三行删除
1
2
3
4
6
7
8
9
10
-i  对源文件进行修改时启用    先备份 
-i
需要修改文件本身内容时
对于重要文件需先做备份处理
seq 10 >test.txt
cat test.txt 
1
2
3
4
5
6
7
8
9
10
-a 追加
seq 10 |sed '7nihao'
在第二行后追加nihao
1
2
3
4
5
6
7
nihao
8
9

搜索替代 

s/原本内容/新内容/修饰符    查找替换,支持使用其它分隔符,可以是其它形式:

修饰符:

g  全局替换  如 不添加  只是替换每行开头第一个匹配内容

p  显示成功替换的行

I,i  忽略大小写

后项引用      根据”( )“中内容和括号出现的顺序在s/ \num/中填入所取用的括号中内容对应的序号并以\num  写出来即可取出单独的此处内容 

[root@localhost /]cat 1.txt |sed -r 's/.*-(.*)\.jar/\1/'
                                        '-'之前和/之间的括号为\1此为后项目引用
                                         及\后数字根据括号出现顺序依次排序
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

修改配置文件

调用变量来改文件
[root@localhost selinux]name=root
[root@localhost selinux]ed -nr '/$name/p' /etc/passwd
使用双引号
[root@localhost selinux]sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost selinux]sed -nr '/'$name'/p' /etc/passwd
变量上家上单引号
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值