用sed结合awk和grep修改匹配到的行的内容,以及用到的重要shell命令记载(长更)
Posted 杨书落
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用sed结合awk和grep修改匹配到的行的内容,以及用到的重要shell命令记载(长更)相关的知识,希望对你有一定的参考价值。
目录
1、修改、添加文本内容脚本
脚本目的:1、修改匹配到的文本行内容
2、注销匹配行(再最前面加上#号键)
3、检查是否存在/data后边是否存在exec这个字段,如果不存在就加上;如果不存在exec存在noexec,将noexec改成exec;如果两个都不存在是默认defaults,将defaults改成exec;如果存在exec则不做任何操作。
#!/bin/bash
path=/etc/pam.d/common-password
fstab_path=/etc/fstab
#修改短密码
if [ -f $path ];then
pwq=`grep "pam_pwquality.so" $path | grep -v "#"` #匹配不带前‘#’且存在pam_pwquality.so关键字的行
if [ $? -eq 0 ];then
sed -i "/pam_pwquality.so/s/^/#&/" $path #在匹配到的行前面加上‘#’
fi
unix=`grep "pam_unix.so" $path | awk 'print $5,$6,$7'` #匹配pam_unix.so字段所在行并得到第5 6 7字段
if [ $? -eq 0 ];then
sed -i "s/$unix/obscure sha512 minlen=1/" $path #将上匹配到的5 6 7字段替换
fi
fi
#添加exec
exec=`grep "/data" $fstab_path | grep -v "#" | grep "exec"` #找到存在exec和/data前面没有‘#’的行,下同
noexec=`grep "/data" $fstab_path | grep -v "#" | grep "noexec"`
key=`grep "/data" $fstab_path | grep -v "#" | awk 'print $4'` #得到第4个字段
default=`grep "/data" $fstab_path | grep -v "#" | grep "defaults"`
if [[ $exec == "" && $noexec == "" && $default == "" ]];then
sed -i "/\\/data/s/$key/exec,&/" $fstab_path #两个限制条件/data和$key,不存在就加上exec,
elif [[ $noexec != "" ]];then
sed -i "/\\/data/s/noexec/exec/" $fstab_path #将noexec改成exec
elif [[ $default != "" ]];then
sed -i "/\\/data/s/defaults/exec/" $fstab_path#将defaults改成exec
fi
1.1、脚本涉及知识点(awk、grep、sed)
grep----
1-多个限制条件同时满足查找grep “条件1” 文件 | grep “条件2” | grep “条件3”
2-满足多个条件其中一个grep “条件1” | “条件2” | “条件3” 文件
3-grep -v "关键字"
查找不存在关键字的行
4-grep -w "关键字"
精确查找字符串,要关键字都存在才会被查找到:
和" "
不属于字符串
awk
awk 'print $字段1,$字段2'
注意点字段之间用逗号,
连接表示空格,后面用sed替换的时候有空格要加空格
awk -F "分隔符" 'print $第几段'
sed
sed -i #不输出修改,直接修改原始文件,不加-i不修改原始文件
sed -i 's/指定的字符/要插入的字符&/' 文件 #注意这里表示插入到指定字符之前
sed -i "/pam_pwquality.so/s/^/#&/" #解释sed -i "/关键字所在行/s/这行的最前面/添加的是#,&表示执行"
注意: $表示行尾,^表示行首 有引用变量时要用双引号,单引号无法解析
参考: /^*.file.*$/
如果加g表示global,就是全文替换
sed -i 's/指定的字符/&要插入的字符/' 文件 #注意这里表示插入到指定字符之后
sed -i "/\\/data/s/$key/exec,&/"
#解释:这里是匹配/data和$key变量同时存在的行,/data要添加转义符 ‘\\’,&表示执行
System_Name=`cat /etc/os-release | grep -w 'NAME' | awk -F '=' 'print $2' | sed 's/\\"//g'`
#解释:sed 's/\\"//g'这一块是因为查找出来的关键字带有双引号,这里是去掉双引号
sed -i '/termlist/ i\\isGoldenImage=1 \\nGoldenImageVer=002' $baseinfo_path
#解释:在termlist关键字上面添加isGoldenImage=1 GoldenImageVer=002两行,中间用空格和\\n隔开,如果要在下面关键字添加就将i换成a就行
一个重要提醒:如果你的脚本在一个Linux中运行没有问题,但是中间有拷到windows上,再次运行出了错误可能是encode的错误,用doc2unix 文件将文件转为linux格式
2、一些用到易忘的命令
2.1、scp
跨服务器拷贝文件,注这里P
是大写,先要修改要拷贝服务器/etc/ssh/目录下的sshd_config文件中#PermitRootLogin yes
去掉#
表示允许ssh登录,在用service sshd restart
或者systemctl restart sshd
重启该服务,再用下面的scp
scp -P 端口号 登录名@要拷贝到的ip地址:要拷贝到的目录
scp -P 22 test root@114.114.114.114:/opt/lessons/
#解释:端口22 当前路径下test文件,拷贝到114.114.114.114服务器下的/opt/lessons/目录下,登录名是root
2.2、basename和dirname
basename +文件名 #可以获得文件的名字,没有路径
dirname +文件名 #可以获得文件所在路径,没有文件名
2.3、常用的查看文件命令(cat、tail等)
最常用
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 以二进制的方式读取文件内容
2.3.1 cat
cat +文件名 #直接查看
cat -n +文件名 #打印行号查看
cat -b +文件名 #不打印空白行查看
注:nl和tac相似用法
2.3.2 more和less
more/less +文件名
more
空白键 (space):代表向下翻一页;
Enter :代表向下翻“一行”;
/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用
less
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻“字串”的功能;
?字串 :向上搜寻“字串”的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
g :前进到这个数据的第一行去;
G :前进到这个数据的最后一行去 (注意大小写);
q :离开 less 这个程序;
2.3.3 tail和head
tail/head -n +数字+文件 #代表显示后/前几行
tail -f +文件 #表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
这个在看log测试的适合特别适用
2.3.4 od
查看非纯文本文件
2.4 压缩与解压文件
.tar 解包 tar xvf filename.tar
.tar 打包 tar cvf filename.tar dirname
.gz 解压1 gunzip filename.gz
.gz 解压2 gzip -d filename.gz
.gz 压缩 gzip filename
.tar.gz 和 .tgz 解压 tar zxvf filename.tar.gz
.tar.gz 和 .tgz 压缩 tar zcvf filename.tar.gz dirname
tar.xz xvJf ***.tar.xz
.bz2 解压1 bzip2 -d filename.bz2
.bz2 解压2 bunzip2 filename.bz2
.bz2 压缩 bzip2 -z filename
.tar.bz2 解压 tar jxvf filename.tar.bz2
.tar.bz2 压缩 tar jcvf filename.tar.bz2 dirname
.bz 解压1 bzip2 -d filename.bz
.bz 解压2 bunzip2 filename.bz
.tar.bz 解压 tar jxvf filename.tar.bz
.z 解压 uncompress filename.z
.z 压缩 compress filename
.tar.z 解压 tar zxvf filename.tar.z
.tar.z 压缩 tar zcvf filename.tar.z dirname
.zip 解压 unzip filename.zip
.zip 压缩 zip filename.zip dirname
.rar 解压 rar x filename.rar
.rar 压缩 rar a filename.rar dirname
2.5、挂载盘(mount和udiskctl)
mkdir /mnt/usb
mount /dev/sda1 /mnt/usb
#解释:挂载盘首先要有一个挂载目录,然后在用mount将要挂载的盘挂载在挂载目录下
umount /dev/sda1 /mnt/usb 或 umount /dev/sda1 #卸载挂载盘
mkdir a
mount -o username=zhangshan,password=123456 //192.168.1.1/data a
#挂载服务器data文件
udiskctl
碰到无管理员权限的情况下想让自动挂载的u盘上的文件有执行权限的问题。u盘是vfat或ntfs格式的,默认情况下udisks或udiskctl挂上后文件都是644权限的,chmod无效。没有管理员权限就没法用mount,也没法修改fstab。不过问题还是可以解决的。比如用udiskctl的场合,先用udiskctl unmount -b 设备号 把挂上的分区卸载,然后用udiskctl mount -b 设备号 --options umask=000之类的再挂上就可以了。
2.6 service和systemctl
service 服务名 [start | stop |restart |reload |stauts]
systemctl [start | stop |restart |reload |stauts] 服务名
具体的可以看这个链接:https://bre.is/jRWg2Z5P
以上是关于用sed结合awk和grep修改匹配到的行的内容,以及用到的重要shell命令记载(长更)的主要内容,如果未能解决你的问题,请参考以下文章