Shell脚本相关
最新学习Shell脚本的一些用法,尤其是正则表达式相关内容,汇总一下,一遍后期查找
目前发现在CSDN博客里QwQNightmare作者的Shell脚本专题汇总,也分享出来,方便后期跳转,我写的很多内容也有从里面摘抄。
- awk的用法:
-
$ awk –F’,’ ’{print $1,$2}’ test.txt AWK命令类似于上面,test.txt内容如下 #!/bin/bash 2 this is a test 3 Are you like awk This's a test 10 There areorange,apple,mongo,xiangjiao,boluo,yezi 以逗号为分隔符,脚本运行输出如下 #!/bin/bash 2 this is a test 3 Are you like awk This's a test 10 There are orangeapple 如果print $0,表示整行or全部打印出来 ———————————————— 版权声明:本文为CSDN博主「sunflowerfsw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/sunflowerfsw/article/details/52240251
- 正则表达式之grep与sed用法:https://www.cnblogs.com/Magiclala/p/16302303.html
-
sed的用法
查看代码
Linux sed命令具有“增、删、改、查”功能,并可以通过-e执行多条命令。 语法 sed [选项] [动作] [文本文件] 选项 -n 使用安静(silent)模式,仅显示sed处理过的行; -e <script文件> 以选项中指定的script来处理输入的文本文件;多重编辑,命令顺序会影响结果; -f <script文件> 以选项中指定的script文件来处理输入的文本文件; -i 编辑文件(注意备份) 常用动作 a\ 在当前行下面插入文本。 i\ 在当前行上面插入文本。 c\ 把选定的行改为新的文本。 d 删除,删除选择的行。 s 替换指定字符 p 打印模板块的行,通常与sed -n使用。 g 在行内进行全局替换 sed元字符集 ^ 匹配行首,如:/^sed/匹配所有以sed开头的行。 $ 匹配行尾,如:/sed$/匹配所有以sed结尾的行。 . 匹配一个任意字符(除换行符),如:/s.d/匹配s后接一个任意字符,最后是d。 * 匹配任意个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 \< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。 \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。 增("a\","i\") 在第二行下面插入“test line” sed '2a\test line' test.txt 在第二行上面插入“test line” sed '2i\test line' test.txt 在keyword开头的行下面插入“test line” sed '/^keyword/a\test line' test.txt 在keyword开头的行上面插入“test line” sed '/^keyword/i\test line' test.txt 删 删除第3行 sed '3d' test.txt 删除第2~5行 sed '2,5d' test.txt 删除第5行到最后一行 sed '5,$d' test.txt 删除所有包含keyword的行 sed '/keyword/d' test.txt 删除所有以keyword开头的行 sed '/^keyword/d' test.txt 删除空白行: sed '/^$/d' test.txt 删除最后一行: sed '$d' test.txt 改、替换 将文件中字符串keyword替换成kkkkkkk(后缀 /g 表示匹配文件中的每一行) sed 's/keyword/kkkkkkk/g' test.txt 当需要从每一行第N处匹配开始替换时,可以使用 /Ng sed 's/keyword/kkkkkkk/2g' test.txt -n选项和p命令一起使用表示只打印那些发生替换的行: sed -n 's/keyword/kkkkkkk/p' test.txt 已匹配字符串标记& 正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词: echo this is a test line | sed 's/\w\+/[&]/g' [this] [is] [a] [test] [line] 数字匹配 将 TMOUT=$num 替换成 TMOUT=600 ($num由0-9的数字组成,\+ 表示多位) sed 's/TMOUT=[0-9]\+/TMOUT=600/g' test.txt 子串匹配标记 \1 ,匹配给定样式的其中一部分 将 TMOUT=$num 替换成 $num ,相当于去掉前面的“TMOUT=”。 sed 's/TMOUT=\([0-9]\+\)/\1/' test.txt 说明:\(..\) 用于匹配子串,\1 表示匹配到的第一个子串,同理 \2 表示第二个,如: echo TMOUT=100 TMOUT=200|sed 's/TMOUT=\([0-9]\+\) TMOUT=\([0-9]\+\)/\1 \2/' 输出结果为:100 200 查找 查找打印以keyword开头的行: sed -n '/^keyword/p' test.txt 打印奇数行或偶数行 方法1: sed -n 'p;n' test.txt #奇数行 sed -n 'n;p' test.txt #偶数行 方法2: sed -n '1~2p' test.txt #奇数行 sed -n '2~2p' test.txt #偶数行 打印匹配字符串的下一行 grep -A 1 SCC URFILE sed -n '/SCC/{n;p}' URFILE awk '/SCC/{getline; print}' URFILE 从文件读入:r命令 file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面: sed '/test/r file' test.txt 写入文件:w命令 在test.txt中所有包含test的行都被写入file里: sed -n '/test/w file' test.txt 多点编辑:e命令 -e选项允许在同一行里执行多条命令: sed -e '1,5d' -e 's/test/check/' test.txt 上面sed表达式的第一条命令删除1至5行,第二条命令将test替换成check。
- 在指定文件内新增内容
查看代码
#1.全替代内容——多行到指定路径: cat << EOF > /etc/motd ################################### # APPSYSTEM: 系统的名字是啥 # SYSTEM-A: 系统管理员A角 # SYSTEM-B: 系统管理员B角 # DESCRIPTION: 这台机器干啥的 ################################### EOF #2.追加内容——多行到指定路径: cat << EOF >> /etc/motd 3333 4444 5555 6666 EOF #3.在文档末尾添加字段:sed -i '$aXXXXXXXXXX' sed -i '$aPasswordAuthentication yes' /etc/ssh/sshd_config #4.在文档末尾添加字段:>> echo "10.5.15.10 ntpserver" >> /etc/hosts #5.在第N行插入字段:sed -i 'Ni\ sed -i '4i\password 4444' /etc/pam.d/system-auth #6.查询所在行,并替换所在行内容 { result=$(cat /etc/profile | grep TMOUT | awk -F[=] '{print $2}') if [ "$result" ];then LIN_NUM=$(sed -n '/TMOUT/=' /etc/profile) sed -i "$LIN_NUM"'c export TMOUT=600' /etc/profile } #7.多行替换 #替换“tmout=”后门20位数字为800(非数字、大于位的数字不替换) sed -i 's/tmout=[0-9]\{1,20\}/tmout=800/g' /etc/aa #替换“tmout=”后面为数字的为900(非数字不替换) sed -i 's/tmout=[0-9]\+/tmout=900/g' etc/aa #替换“tmout=”后面为任意值为32 sed -i 's/tmout=.\+/tmout=32/g' etc/aa
- grep和sed配合替换文件中的字串,
- 通过grep、awk复核命令,确定行数,并对指定文件的指定行进行修改替换
#cat a.txt文件并显示行数 | 查找XAXXX998所在的行 | 查找GW-B001223491所在的行 | awk $1(第1列的值) |最后整体赋值给Num Num=`cat -n a.txt |grep XAXXX998 |grep GW-B001223491 |awk '{print $1}'` #输出打印Num的值,实际显示为TA1908918 echo $Num #把Num所在的行,所有包含TA1908918的值替换为test 从a.txt文件中 sed -i "${Num}s/TA1908918/test/g" a.txt
- 通过grep、awk复核命令,输出指定的值,并打印
#cat a.txt文件 | 查找acredit所在的行 | awk $4(第四列的值) | 用“=”号分割这个值,取第二个值 |最后整体赋值给Num Num=`cat a.txt | grep acredit= | awk '{print $4}' | cut -d "=" -f 2` #显示输出Num的值 echo $Num
- awk找出/etc/passwd中具有root权限的账号,awk -F“:”用:分割;如果$4等于0;NR打印行号,$0打印整行
root@localhost:/root#awk -F":" '{if ($4==0) print (NR,$0) }' /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin
- awk -F ,用:符号分割,取行数不为1的第三列的值,并显示行号
root@lzctest20220513:/tmp#awk -F[:] 'NR!=1{print NR,$3}' /etc/passwd 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 11 11 12 12 14 13 99 14 192 15 81 16 999
- #.备份文件时添加当前时间
mv /etc/ntp.conf /etc/ntp.conf.bl.`date +%Y%m%d%H%M%S`