1.0
1-1 位置锚定
^:行首锚定,表示以什么开头。
$:行尾锚定,表示以什么为结尾。
^$:匹配的是空行。 \<:也可以写成\b,词首锚定,用于单词模式的左侧(连续的字符,数字,下划线都算单词内部)。
\>:也可以写成\b,词尾锚定,用于单词模式的右侧。
\broot\b:匹配整个单词,而不是匹配行。
^root$ #匹配整行,而且整行只能有这一个字符串。
1-2 分组和逻辑或
分组:()
或: \ |
1-3 扩展正则表达式
*
?
+
{n}
{n,m}
{n,}
{,n}
|
用法:
grep -E
sed -r
egrep
2.0
2-1 sed
免交互。
按行来处理。
sed是一张流编辑器。
除非确认操作,否则数据一概不变,在缓冲区的数据,展示结束之后,会被立刻销毁。
常用选项:
-e 指定命令来处理输入的文本文件,只要 一个操作命令,-e可以不写。一般都是执行多个操作命令 -e。
-f 用指定文件中的脚本来对另外一个文件进行处理。
A B
A脚本命令 -----B 文件内容进行处理
-i:将会直接生效,慎用。
-n:屏蔽默认输出。只显示一条结果。
操作命令:
s:替换字符。
d:删除内容,删除指定行。
a:新增,在当前行的下面插入一行指定内容。
i:插入,在选定行的上面插入一行内容。
c:替换整行。
y:单字符转换,转换前后的字符长度,必须保持一致。
p:打印。
r:扩展正则表达式。
sed的主要作用是对文本内容的增删改查。
打印偶数行
sed -n 'n;p' test.txt
打印奇数行
sed -n 'p;n' test.txt
*面试题:如何免交互删除文件的内容,保留文件*
sed -i 'd' test1.txt
cat /dev/null > test1.txt
*面试题:删除空行,过滤空行*
sed '/^$/d' test.txt 面试首选回答sed
grep -v "^$" test.txt
cat test.txt | tr -s "\n"
操作符 s
sed 's/[A-Z]/\l&/g' test.txt
将字母大写进行替换成小写。
l&:l+& 转换小写的特殊符号,前面要加\转义符。
sed 's/[a-z]/\u&/g' test.txt
将字母小写进行替换成大写。
u&:u+& 转换大写的特殊符号,前面要加\转义符。
操作符 c
sed '/one/c 我真帅!' test.txt
sed '/要替换的行/c 替换的内容' test.txt
最简单最实用
单字符替换:
y 只是对单字符替换,前后的长度必须一一对应。不是整体替换。
sed 'y/要替换的字符/替换后的字符/' test.txt
如果替换字符长度不对等 -> sed 'y/s/好帅/' test.txt × -> sed 'y/sf/好帅' test.txt
操作符 r
#three这行读取另外一个文件,然后插入到three行下
sed '/three/r ky01.txt' test.txt
操作符 i
sed '$i 1111' test.txt
*面试题*匹配文档内容中的版本号
cat 1.txt | grep -E '[0-9]+\.'
cat 1.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'
*笔试题*查看指定时间内的日志
sed -n '/14:00:01/,/14:42:23/p' /var/log/messages
-f:第一个文件当中命令对第二个文件的内容进行处理
sed -f 1.txt 2.txt
3.0
3-1 awk
awk:是一个强大的文本编辑工具,逐行读取文件内容,然后输出结果。
最强大的功能swk本身也是一个开发工具,内置代码,和java很像。
按行取列:
和cut类似,cut的默认分隔符是一个tab键
awk的默认分隔符是空格或者tab键,但是多个空格,多个tab键,他会自动压缩成一个。
awk可以在免交互的情况下,实现复杂的文本操作。
awk 'pattern action' file 操作符 怎么干 处理对象
awk的选项:
-F:指定分隔符,默认是空格可以不加。
-v:变量赋值。
awk '模式或条件{处理动作}'
awk的默认处理动作就是打印。
awk内置变量:
1、$0:打印所有
2、$n:处理行的第几列
3、NR:处理行的行号 NR = >
4、NF:处理行的字段个数,$NF代表最后一个字段
begin模式:先定义条件,然后对条件进行操作,最后对操作进行处理。
打印文件行号和内容
awk '{print NR,$0}' test.txt
指定行号打印
awk 'NR==3{print}' test.txt
awk 'NR==3,NR==5{print}' test.txt
awk 'NR==3;NR==5{print}' test.txt
范围打印
awk '(NR>=3)&&(NR<=5){print}' test.txt
偶数行打印
awk 'NR%2==0{print}' test.txt
奇数行打印
awk 'NR%2!=0{print}' test.txt
取幂运算
awk 'BEGIN{print 3^2}'
awk 'BEGIN{print 3**2}'
如何通过awk进行文本过滤打印
awk '/^root/{print}' /etc/passwd
awk '/root/,/operator/{print}' /etc/passwd 范围过滤
awk '/bash$/{print}' /etc/passwd 过滤以bash结尾
awk 'BEGIN{x=1};{x++};END{print x}' test.txt 初始化条件 对初始化条件进行操作 处理动作
head -n 5 /etc/passwd | awk -F: '{print $4}' 打印前五行的第五列
如何用begin模式指定打印
head -n 5 /etc/passwd | awk 'BEGIN{FS=":"};{print $5}'
awk的精确筛选:
$(><==):用于对比数值。
$n~"字符串":代表第n个字段包含某个字符串。
$n!~"字符串":代表第n个字段不包含某个字符串。
$n=="字符串":代表第n个字段为某个字符串。
$n!="字符串":代表第n个字段不为某个字符串。
$NF:最后一个字段。
awk的三元表达式
*面试题*:awk -F: '{max=($3>=$4)?$3:$4; {print max,$0}}' /etc/passwd
max $3 $4
? 表示if
: 表示else
4.0
4-1 免交互
交互:计算机播放器,放视频,发出指令,计算执行执行指令,做出对应的动作,播放视频。
Linux系统中的交互,passwd
尤其在shell脚本中,我们的运行就是免交互。自动化运维。
两种格式 here Documnet 免交互
expect 语法实现免交互
here Documnet:
语法格式:
--------------
命令 <<标记
内容
标记
---------------
注意事项:
1、标记名称可以自定义,但是必须要是合法字符(字母开头,后面跟数字,不要有特殊符号)。
2、结尾标记一定要顶格写,前面不能有任何字符,包括空格。
3、结尾的标记后面也不能有任何字符,包括空格。
4、开头标记前面如果有空格,会被省略。
支持变量替换
expect:建立在tcl语言基础上的一个工具,用于自动化控制和测试,主要用来解决shell当中的交互问题。
passwd
123
123
转义字符:
1、\n 表示换行符
2、\t 表示制表符 tab键
3、\r 表示回车,可以和\n通用。
4、\b 表示退格符,相当于backspace
第一步:
#!/usr/bin/expect
第二步:
开启跟踪执行的命令
spawn 开启一个会话和启动进程,并且跟踪后续的交互信息。
spawn passwd p
第三步:
捕获动作
expect 捕获想要的内容,匹配输入字段,然后输入内容。
第四步:
发送指令
send 向进程发送字符串,模拟用户的输入。send不能自动换行,一般后面要跟上\r或者\n
expect "新的密码:" {send "abc123\r"}
写在一行必须要加花括号
方式二:
expect "密码"
send "abc123\r"
多分支:
expect
{
"密码1" {send "abc123\r"}
"密码2" {send "abc123\r"}
}
第五步:定义结束符号
expect eof
交互结束之后,会退回到原用户。
su - p
root
interact
执行完成之后保持现有状态,不变
结束符号只能二选一,不能同时存在
参数设置:
set 设置命令,可以更改内部的一些参数
set timeout 5 设置脚本的超时时间为5秒
默认是10秒
exp_continue
相当于在expect捕获判断之后,还能够继续向下匹配。
类似于continue 表示允许expect继续向下执行指令。
语法格式:
expect{
"(yes/no)"{send"yes\n";exp_continue}
"password"{send "abc123\n"}
}
expect eof
否则报错
打印功能:回显命令
send_user 跟echo一个作用,打印一个字符串。
接受参数:
可以接受从bash的命令行传入的参数。类似于位置变量的格式
set hostname [ lindex $argv 0]
set passwd [ lindex $argy 1]
hostname=$1
passwd=$2
执行方式:
bash sh source都不能执行expect脚本,必须赋权之后用./或者绝对路径执行
嵌入执行模式:将expect的过程融入shell当中,一块执行。
切换终端环境的交互命令,不要用嵌入模式
#!/bin/bash
免交互:
/usr/bin/expect <<-EOF
EOF