linux day30 最新(三剑客命令共性,grep命令,sed,awk,expect)听的比较模糊,状态不好
今日内容:
1,grep命令&正则表达式(并不是grep独有的)
2,sed
3,awk
4,expect(A可斯拜可特):交互的命令变为非交互。写好代码,然后expect帮你去交互,
远程执行命令 ssh root@1.1.1.1 hostname (如果后面不加命令,就是远程登录,要求输入用户名,密码。)
grep,sed,awk,为什么叫三剑客命令,全称叫:文本处理三剑客,因为他们三个在处理文本的时候确实非常常用,各自有各自擅长的点。
1,grep擅长过滤文本。
2,sed把编辑文件变成非交互式修改,写脚本时用。
3,awk擅长格式化有规律的文本,如passwd,对文本列进行操作。
注:linux里一切皆文件,所以以后会非常常用。
三剑客命令的共性:(并不是所有命令都支持正则表达式,如ls *,rm -rf*这不是正则表达式,这是元字符)
1,都支持正则表达式
2,都支持管道,同时都可以从管道里取出结果在做处理。
例子:
useraddd egon
passwd egon 这样添加用户密码,会进入交互式环境
echo 123 | passwd egon --stdin 而这种不需要,--stdin是标准输入的意思。
一,grep命令
1,分为:
grep
egrep,支持扩展的正则表达式,支持的正则表达式更多。egrep等于grep -E
2,grep命令格式:
grep 选项 正则表达式 文件
首先为了简单易懂学习grep命令,先忽略正则表达式。
head -10 /etc/passwd > test.txt 将passwd的前十行
用法一,grep "root" test.txt 打开文件,每读一行,都用正则表达式去匹配一下,但凡匹配成功一次,该行就被过滤出来。
用法二,cat test.txt | grep "root"
grep的选项
1,-n,过滤结果带行号。
2,-o,只把过滤的成功的内容显示出来,
3,-q,静默输出,判断过滤成功没,不想把过滤内容显示出来。
-q的使用场景,假如现在要求,判断test.txt 是否包含有root的行
grep "root" tset.txt
if [ $? -eq 0 ];then
echo "ok"
else
echo "no'
fi
给个执行权限,chmod +x 13.sh
./13.sh
其实只是想打印ok还是no,这时候-p就达到需求。(还可以使用以前学习的在grep "root" tset.txt &>/dev/null)
4,--color,不用管,默认就加上了颜色。
5,-i 忽略大小写
6,-A ,2,除了过滤的行,它的后两行也过滤出来
7,-B,2,除了过滤到的行,它的前两行也会过滤出来
8,-C,2,除了过滤的行,上下指定行过来出来。
9,-C,统计出过滤成功的行数
10,-v,取反的意思。grep -v "root" tset.txt
11,-w,匹配单词
12,-E , 等于egrep,扩展。
这时候来一个需求,知道一个配置项,但是不知道它在哪。
13 ,-l ,显示那个文件名,不管哪一行,只要包含显示。
14 ,-r,递归查找
grep -rl "location" /etc/ rl一般都是搭配使用,找配置,不知道配置在哪个文件,非常常用。
正则表达式
1,^,只从头开始匹配 grep -n "^root" /etc/passwd
2,$只从末尾开始匹配 grep -n "bash$" /etc/passwd
3,.
4, * ,星左边的字符出现0次或无穷次,星贪婪的。ab*,最小是a
5 .*
第一行,会发现,它会选择最远的c,说明是贪婪的,但是贪婪通常是有害的。使用-P .*?
可以取消贪婪属性。
6[ ],相较于.可以任意指定,匹配指定范围的任意一个字符
如:[alcd2],就是这其中的一个字符都可以,[0-9]0到9的任意一个数字都可以,或者是[a-zA-Z]。
这里-中括号里的减号,放在开头,或者结尾,如果-号两边有东西,就会变成一个从哪到哪的意思,经常报错。!号在正则表达式里只是普通符号。
这里如果再中括号内加上^就代表取反的意思,而如果再中括号外的a前面加^就代表从头开始匹配的意思。
7,+,左边的字符出现1次或者无穷次。和*有区别。
ab+,最小匹配的是ab,需要使用拓展,egrep
ab*,最小匹配的是a
学这个干嘛使,怎么使用?
现在需求是匹配整型数字。要求用户输入的必须是整型数字。
二 sed命令
第一种场景,定位到某一行,然后将该文件的某一部分给替换掉
sed -r "定位+操作" test.txt
sed -r "3s/egon/EGON/gi" test.txt (第一个egon是可以写正则的,但3才是定位的。如只把开图的egon换掉,"3s/^egon/EGON/gi")
上图。
1,首先不加-i,-g,就是第三行从左匹配到右,只匹配小写egon,换成了6666。
2,然后加上-i,忽略大小写,但从左到右匹配一个就停下。
3,这时候加上g,从左到右全部匹配,同时还忽略大小写。
4,-r基础上,再加上-i,就会修改原文件。
上图上下面俩个的实验。
sed -r "3,5操作" test.txt
sed -r "1操作;3操作"test.txt
sed -r "/^[a-zA-Z]/s/egon/EGON/gi" test.txt 代表把以字母开图的行,里的egon改成大写的EGON。
第二种场景,定位到某一行,然后删除
sed -r "1,3d" new.txt
sed -r "/^[0-9]/d" new.txt
第三种场景,在改行后添加新的配置
sed -r "1a xxxxxxxxxxx" new.txt 第一行添加
场景4:定位到某一行,在改行后添加新的配置
sed -r "1c xxxxxxxxxxxx" new.txt 第一行整行替换
sed它叫流式编辑器,它在一启动时,这个程序在内存运行起来了,文件内容test.txt在硬盘放着,它会把test.txt内容读一行到内存,然后根据“”号里的规则处理,如果引号没有内容,就会默认放到显示屏内,没有修改原文件,然后再读一行到内存,处理一下,然后放在显示屏,直到把原文件全部读完。如果想要修改原文件,加上-i就不是往屏幕里丢了,而是直接丢到原文件里去。不过不建议直接就-i,而是先编辑输出到屏幕上,看看有没有问题,然后再-i。
这里的-r,是拓展正则表达式的意思。就是可以使用正则选项。
同时加上-i后,回城,然后查看new.txt文件,发现没变,但是其实已经改变,虽然一样,但是其实是进行了一次覆盖操作。新的把旧的覆盖了一次,只不过一模一样。
懂了这些原理,我们要做的就是定位到某一行,进行操作。首先是定位。
定位分为俩种方式:
1,行号定位,
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 2,正则定位,
三,awk命令
擅长做列处理,首先需要定位。
awk -F: "定义{}" 文件路径
awk -F: 'NR==3 {print $1,$7}' /etc/passwd 定位到第三行
awk -F 'NR>3 && NR<5{print $0} ' 文件路径
awk -F 'NR>3 || NR<5{print $1"-"$3} '文件路径
awk -F '/bash$/{print $1}' /etc/passwd
获取ip地址:
四,expect
用来把交互变成非交互,原理是一问一答,每敲一条命令,可能默认就是交互命令,ls直接返回一个东西。敲完一条命令,直接expect在原地捕捉这条命令给你返回的交互信息,如果它匹配上这个交互信息当中包含某一个字符的话,这就叫匹配成功。(它帮你完成交互)
yum install expect -y
根据上面的模板,修改需求。