Shell脚本相关

最新学习Shell脚本的一些用法,尤其是正则表达式相关内容,汇总一下,一遍后期查找

目前发现在CSDN博客里QwQNightmare作者Shell脚本专题汇总,也分享出来,方便后期跳转,我写的很多内容也有从里面摘抄。

  1. awk的用法:
  2. $  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
  3. 正则表达式之grep与sed用法:https://www.cnblogs.com/Magiclala/p/16302303.html
  4. 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。
  5. 在指定文件内新增内容
    查看代码
    #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
  6. grep和sed配合替换文件中的字串,
  7. 通过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
  8. 通过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
  9. 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
  10. 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
  11. #.备份文件时添加当前时间
    mv /etc/ntp.conf /etc/ntp.conf.bl.`date +%Y%m%d%H%M%S`
  12.  

 

posted @ 2022-05-23 17:50  Magiclala  阅读(52)  评论(0编辑  收藏  举报