11、shell_sed
发布时间:2020-12-16 01:54:00 所属栏目:安全 来源:网络整理
导读:正则表达式 ???? 正则表达式,就是用一种模式,去匹配一类字符串的公式。 ? 正则表达式的解释是用正则表达式引擎来实现的,常用正则表达式引擎有两类: 基本正则、扩展正则。 正则表达式基础: 正则表达式是由一些普通字符和元字符组成。 元字符不再表示字符
正则表达式
????正则表达式,就是用一种模式,去匹配一类字符串的公式。
?
正则表达式的解释是用正则表达式引擎来实现的,常用正则表达式引擎有两类:
基本正则、扩展正则。
正则表达式基础:
正则表达式是由一些普通字符和元字符组成。
元字符不再表示字符本身,而代表一些特定控制意义。
正则表达式元字符:
基本正则:^ ??$ ??. ??* ??[] ?? ??{n,m}
扩展正则:? ??+ ??| ??{n,m} ?()
????^ ????表示开头
????????????^a ????以a开头
????^b ????以b开头
????
???????? 例:显示以r开头的用户名
?????cut -d: -f1 /etc/passwd | grep ^r
???
????????? 例:显示不以r开头的用户名
?????cut -d: -f1 /etc/passwd | grep -v "^r"
例:显示 httpd 或 vsftpd 的配置文件,去掉注释
?????
????$ ????表示结尾
????a$ ???表示以a结尾
????b$ ???以b结尾
? 例:查看本机不允许登录的用户
????cat /etc/passwd | grep "nologin$"
????. ????任意字符
例:第2个字符是a
????.a
???????
????* ????零个或多个
例: 查看每行至少含有2个或以a的行
????cat test.txt | grep aaa*
????[] ????字符范围
例:以a或b开头的行
????cat test.txt | grep "^[ab]"
????????????例:显示以数字开头的行
????cat test.txt | grep ^[0123456789]
????cat test.txt | grep ^[0-9]
要注意的是:如果 ^ 放在[ ?] 中不再表示开头,表示的是取反
???? ?????转义
????{m,n} ???
限定字符长度,有m-n个
POSIX 正则表达式集
[[:alpha:]] ? 任意字母
[[:alnum:]] 任意字母或数字
[[:blank:]] 空格或制表符
[[:digit:]] 0-9的数字
[[:lower:]] 小字字母
[[:upper:]] 大写字母
[[:print:]] 可打印字符
扩展正则元字符:
????? 零个或一个
???? 例:显示有2到3个a的行
?cat test.txt ?| egrep aaa?
????+ 一个或多个
例:显示至少有3个a的行
cat test.txt ?| egrep aaa+
????| 或
2或4开头的行
cat test.txt ?| egrep "^2|^4"
cat test.txt ?| grep "^[24]"
????{} ?表出现次数
例:显示行有2到4个a的行
cat test.txt ?| egrep "a{2,4}"
????() ?分组
把符合替换的一系列字符分到一组中(打包)
然后在后续的命令中用 1 ?2 ?3 ?等去引用它们
grep/egrep 文本搜索
格式: grep 文本 路径
-r ? 子目录也搜
-v ??排除
例:在 /etc 下看看哪个文件下有 sshd
grep sshd /etc/*
grep -r sshd /etc/*
sed (stream editor) 流式编辑器
传统的编辑器,如 ?vi/vim ?交互式的,需要人工去操作,这样功能虽然很强大,
但在做编程时,如需要修改一个文件的内容,这样是很难做到的。
而sed 它的工作方式完全不一样,它没有交互,所有的操作都是写在命令中完中,
如:我要删除文件的第2行
格式:sed [option] ‘[address]{command}‘ [file_name]
????option:
-i ? 直接在原文件操作,默认在内存中进行
-f file 将操作系统写到命令文件,sed 从文件中读操作命令
-n 不输出
????address:
它表示的是操作地址(内容)
可用两种方式来表示address
1、行模式
写具体的行,如 1、2、$
???sed ‘$d‘ test.txt
???sed ‘1,$d‘ test.txt ??--全文删除
2、模式匹配
???/匹配模式/ ????即用// 把某种特征符(正则表达式)括起来
??sed ‘/^#/d‘ vsftpd.test
????command: ?表示要操作的命令
具体命令后面再讲
????command 中同时执行多条件的处理
1、将每个命令用参数 -e 连接起来
???例:将vsftpd.test 中的注释删除,同时将anonymous_enable改为NO
??????sed -e ‘/^#/d‘ -e ‘/anonymous_enable=YES/
??????????????????????canonymous_enable=NO‘ vsftpd.test
??????echo "The tiger" | sed ?-e ‘s/tiger/cat/‘ -e ‘s/cat/dog/‘
2、将sed 命令用分号分隔
???echo "The tiger" | sed ‘s/tiger/cat/;s/cat/dog/‘
3、将多条命令写到文件
????????4、命令分行号,用{} 括起来
???echo "The tiger" | sed ‘{
> s/tiger/cat/
> s/cat/dog/
> }‘
??
????sed 操作命令:
s 替换
s/原字符/新字符/参数
参数:
g 一行中所有的都替换,不加的话,只替换一行中的第一个
? p 打印
?? n(1-512) ?替换一行中第n次出现的字符
例:把/etc/passwd 中的root改为admin
sed -n ‘s/root/admin/pg‘ /etc/passwd
1-10中的 不用登录的用户,改为能登录
sed -n ‘1,10s/sbin/nologin/bin/bash/p‘ /etc/passwd
???????????例:把第一个字符和第二个字符换掉
[[email?protected] test]# sed ‘s/(^.)(.)/21/‘ test.txt ?
d 删除行
例:删除第2行
???????sed ‘2d‘ test.txt
例:把文件中的空行删除
a ???行后追回
i ???行前插入
?????例:sed ‘5a iiiiiii‘ test.txt
sed ‘5i iiiiiii‘ test.txt
c ???整行修改(修改的是一行)
例:把第3行改为 ??my sed test change
vsftpd 文件中的 ??anonymous_enable 改为 NO
同时增加一行 ?local_root=/share/ftp
??????sed -n ‘/^anonymous_enable/s/YES/NO/p;
?????????????????????/^local_enable/a local_root=/share/ftp/‘
?????????????????????vsftpd.test
y ???字符变换,对单个字符进行一一替换
a变成A
?????sed ‘y/a/A/‘ test.txt
= ???显示行号
?????sed ‘=‘ /etc/passwd
nq (如3q) 显示多行
?????sed ‘3q‘ /etc/passwd
w ???写文件
w 文件名
vsftpd 的前3行写到一个文件aa中
????????sed ‘1,3w aa‘ vsftpd.test
例:去掉 vsftpd 的注释,将主要内容放到bb中
r ???读文件,把其它文件中的内容,复制到当前文件中
bb的内容放到aa中,第2行后
sed ‘2r bb‘ aa
! ???取反
sed -n ‘/bash$/p‘ /etc/passwd ??--打印bash结尾的行
?????????sed -n ‘/bash$/!p‘ /etc/passwd ?--不打印以bash结尾的行
作业:
????1、删除文件中每行的第一个字符
sed ‘s/^.//‘ test.txt
????2、删除文件中每行的第二个字符
sed ‘s/(^.)(.)/1/‘ test.txt
????3、删除文件中每行的最后一个字符
sed ‘s/.$//‘ test.txt
????4、删除所有带数字的行
sed ‘/[[:digit:]]/d‘ test.txt
sed ‘/[0-9]/d‘ test.txt
????5、把当前的ip地址写到 /etc/sysconfig/network-scripts/ifcfg-eth0
大致过程:
???1) 获得当前的IP地址(不能是眼睛看的,要用程序去获取)
??????ifconfig eth0 | grep "inet addr" | cut -d: -f2 |
???????????????cut -d " " -f1
??????
-------------------------------------------
ifconfig ??查看、修改ip(临时性修改)
查看
??ifconfig ?[网络接口名] ?
如:ifconfig eth0
临时性修改:
??ifconfig [网络接口名] ip地址
ifconfig eth0 10.1.1.xxx
永久性修改为静态IP:
??vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static ???--静态的,如果是DHCP就是动态
......
IPADDR=10.1.1.178 ??--如果是静态的必须有这一行,DHCP会忽略这一行
ONBOOT=yes
???????????
??修改后,要重启网络服务:
service network restart
-------------------------------------------------------
????6、写个程序 修改主机名,修改时,从键盘输入主机名,然后在临时修改,再永久
修改(即把主机名写到配置文件)不能用 vim ,要在程序中用sed 来实现。
hostname ?????????????????????--查看主机名
????????hostname xxx.uplooking.com ???--临时修改
要永久性修改要把 hostname=xxx.uplooking.com 写到配置文件 ?
/etc/sysconfig/network
如:
#!/bin/bash
#
read -p "请输入主机名:" hn
思考:
? ???/etc/passwd 前5行中的第一第二列换掉
???????如:原来是 root:x
???????????????????换成 x:root
思路:把root和x 分为两组 ????????? (root):(x)
然后倒转引用,后面的放前,前面的放后 ????2:1
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |