• 3 .shell 之linux四剑客sed/grep/awk/find


    Shell编程之linux四剑客命令案列分析

    在我们日常的Shell编程中我们会用到很多的一些语句,有的语句,如果用好了,可以让我们的脚本更上一层楼,让我们的功能更容易满足企业的需求。

    一.Sed命令

    动作说明

    • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

    • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

    • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;

    • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

    • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

    • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

    sed命令的选项(option):

    -n :只打印模式匹配的行

    -e :直接在命令行模式上进行sed动作编辑,此为默认选项

    -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

    -r :支持扩展表达式

    -i :直接修改文件内容

    作用:文件外命令对文件内容进行操作

    ​ vi test.txt

      
    # name info
    My name is kongdesheng
    This is my first scripts!
    192.168.1.11
    192.168

    :%s/169/168/g #文件中把全部169改成168
    列1: 把文件中内容为'192'的字符串特换为10
     sed 's/192/10/g' test.txt     //缓存修改,实际文件内容未变
     sed -i 's/192/10/g' test.txt  //文件内容真正被修改
    
    
    列2:在文件内容的行首添加一个空格
    #在文件内容的行首添加一个空格,‘^’:代表开始
    sed 's/^/&  /g' test.txt    
    #在文件内容的行首添加一个id空格,在实际工作中用for循环把id替换成1,2,这种行号一行一行的加入行号
    sed 's/^/&id  /g' test.txt  

     

    列3:在文件内容的行尾添加一个'id'
      #在文件内容的行尾添加一个空格id,‘$’:代表开始
      sed 's/$/& id/g' test.txt  
     
    列4:在文件内容“kongdesheng”的后面插入一行内容
      
      #'a':下一行新增
      sed '/kongdesheng/a and is lisi' test.txt    

    列5:在文件内容“kongdesheng”的前面插入一行内容
      
      #'i':前一行新增
      sed '/kongdesheng/i and is lisi' test.txt
     
    列6:打印文件内容“kongdesheng”的一行内容
      
      #'-n' :只打印模式匹配的行
      sed -n '/kongdesheng/p' test.txt   
     
    列7:打印第指定行的内容
      sed -n '1p' test.txt  #打印第一行
      sed -n '3p' test.txt  #打印第三行
      sed -n '1,5p' test.txt  #打印1至5行

    列8:一个文件中,有一堆数据,大小不一,行号不定,找出出文件中最大最小的一个数

    vi test.txt

      
    11 653 9852
    23415566 6561

    79446 5432 314
    94463
    4461
    642 21 19

    命令:

      #sed's/ /
    /g' 把空格换行,把每个数字为一行 
      #grep -v "^$"  grep:分组过滤筛选数据,-v:剔除匹配后面结果的行,这里作用是去除空行
      #sort -nr      排序(-nr:降序, -n:升序) -r将数字当做字符进行排序,-nr 按照整个数字来排序
      #sed -n '1p'   打印第一行
      #sed -n '1p;$p'   $代表最后一个,这里$p代表最后一行
      cat test.txt |sed 's/ /
    /g'|grep -v "^$"|sort -nr|sed -n '1p;$p'

    二.Awk命令

    作用:常用于对列的筛选

    选项参数说明:

    • -F fs or --field-separator fs指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

    • -v var=value or --asign var=value赋值一个用户定义变量。

    • -f scripfile or --file scriptfile从脚本文件中读取awk命令。

    • -mf nnn and -mr nnn对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    • -W compact or --compat, -W traditional or --traditional在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

    • -W copyleft or --copyleft, -W copyright or --copyright打印简短的版权信息。

    • -W help or --help, -W usage or --usage打印全部awk选项和每个选项的简短说明。

    • -W lint or --lint打印不能向传统unix平台移植的结构的警告。

    • -W lint-old or --lint-old打印关于不能向传统unix平台移植的结构的警告。

    • -W posix打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效。

    • -W re-interval or --re-inerval允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

    • -W source program-text or --source program-text使用program-text作为源代码,可与-f命令混用。

    • -W version or --version打印bug报告信息的版本。

    列1:文件test.txt,内容如下一行,请打印出第四列的值

    vi test.txt

      My name is kongdesheng
      #$4:打印第四列
      awk '{print $4}' test.txt
      #或者
      cat test.txt |awk '{print $4}'
      ​
      #$nf:打印全部
      awk '{print $nf}' test.txt
      ​
      #$NF:打印最后一列
      awk '{print $NF}' test.txt

    列2:打印/etc/passwd文件中的第一列(用户)
      #-F:以''为分隔划分列(默认是空格划分列)
      cat /etc/passwd |awk -F: '{print $1}'
      #或者如下
      #sed 's/:/ /g':把冒号换成空格
      cat /etc/passwd |sed 's/:/ /g' |awk '{print $1}'

    列3:从ifconfig命令集得到ip地址

      #grep 'netmask' :查找包含'netmask'的行
      #awk '{print$2}':第二列
      ifconfig ens33 |grep 'netmask'|awk '{print$2}'

    列4:df -h 检查linux服务器的文件系统的磁盘空间占用情况,返回占用率

      #grep "/$" :以'/'结尾的行
      #awk '{print$5}' :第五列
      df -h |grep "/$" |awk '{print$5}'
      # sed 's/%//g' :去除'%'号
      df -h |grep "/$" |awk '{print$5}'| sed 's/%//g'

     

    列4: 在内容前面加属性

    
      #'^' 开始
      #'$' 末尾
      awk '{print$NF}' test.txt |sed 's/^/Name:/g'
      或者
      awk '{print"Name:"$NF}' test.txt

    三.Find命令

    语法:

     find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} ;

    参数说明 :

    find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

    expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

    -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

    -amin n : 在过去 n 分钟内被读取过

    -anewer file : 比文件 file 更晚被读取过的文件

    -atime n : 在过去n天内被读取过的文件

    -cmin n : 在过去 n 分钟内被修改过

    -cnewer file :比文件 file 更新的文件

    -ctime n : 在过去n天内被修改过的文件

    -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

    -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

    -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

    -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

    -exec :承接

    |xargs : 承接作用,使用时有局限,

    -type c : 文件类型是 c 的文件,type可以是以下的值

    d: 目录

    c: 字型装置文件

    b: 区块装置文件

    p: 具名贮列

    f: 一般文件

    l: 符号连结

    s: socket

    列1:根目录下查找test.txt文件
      # /  根目录
      find / -name 'test.txt'

    列2:当前目录下查找test.txt文件
      # .  当前目录
      find . -name 'test.txt'

    列3:当前目录的第一级目录查找查找test.txt文件
      # -maxdepth 1  第一级目录
      find . -maxdepth 1 -name 'test.txt'

    列4:当前目录下的第一级目录查找.txt结尾的文件
      #-type f  文件
      find . -maxdepth 1 -type f -name '*.txt'
    列5:查找30天以前修改过的的文件
      # /  根目录
      # -maxdepth 3  根目录三级以内的目录
      # -type f      文件
      # -mtime +30   三十天以前修改的文件
      find / -maxdepth 3 -type f -name '*.txt' -mtime +30

    列6:查找1天以内修改过的文件
       # .  当前目录
       # -maxdepth 3  当前目录三级以内的目录
       # -type f      文件
       # -mtime -1   1天以内修改的文件
       find . -maxdepth 3 -type f -name '*.txt' -mtime -1

    列7:当前目录下查找一天以内修改的文件 删除
    # .  当前目录
    # -maxdepth 1  一天以内的目录
    # -name "*.text" 结尾为.text
    # -type f      文件
    # -mtime -1   1天以内修改的文件
    # -exec rm -rf {} 把前面的结果承接引入到大括号位置
    # ;    固定的格式
    find .
    -maxdepth 1 -type f -name "*.text" -mtime -1 -exec rm -rf {} ; #或者 find . -maxdepth 1 -type f -name "*.txt" -mtime -1 |xargs rm -rf {} ;

    列8:当前目录下查找一天以内修改的文件,复制到tmp文件夹下
     # .  当前目录
     # -maxdepth 1  一天以内的目录
     # -name "*.txt" 结尾为.txt
     # -type f      文件
     # -mtime -1   1天以内修改的文件
     # --exec cp {} /home/ 把前面的结果承接引入到大括号位置
     # ;    固定的格式
     find . -maxdepth 1 -type f -name "*.txt" -mtime -1 -exec cp {} /home/ ;

    列9: 查找内存大于 20M的文件
      find . -size +20M

    列10:从根目录三级目录内查找100M以内的文件
      find / -maxdepth 3 -size +100M -type f

    列11:删除当前目录下30天以前的文件
     find . mtime +30 -exec rm -rf {} ;

    四.Grep命令

    作用:对内容进行过滤

    参数

    • -a 或 --text : 不要忽略二进制的数据。

    • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。

    • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。

    • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。

    • -c 或 --count : 计算符合样式的列数。

    • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。

    • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

    • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。

    • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。

    • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

    • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。

    • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。

    • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。

    • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。

    • -i 或 --ignore-case : 忽略字符大小写的差别。

    • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。

    • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。

    • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

    • -o 或 --only-matching : 只显示匹配PATTERN 部分。

    • -q 或 --quiet或--silent : 不显示任何信息。

    • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。

    • -s 或 --no-messages : 不显示错误信息。

    • -v 或 --revert-match : 显示不包含匹配文本的所有行。

    • -V 或 --version : 显示版本信息。

    • -w 或 --word-regexp : 只显示全字符合的列。

    • -x --line-regexp : 只显示全列符合的列。

    • -y : 此参数的效果和指定"-i"参数相同。

    列1: 匹配以11开始的文件行
       grep "^11" test.txt 

    列2: 匹配以61结尾的文件行
     grep "61$" test.txt 

    列3: 匹配包含有0至9的文件行
    grep "[0-9]" test.txt 

    列4: 匹配包含有a至z的文件行
      grep "[a-z]" test.txt 
      #匹配大写A-Z开始的行
      grep "^[A-Z]" test.txt 

     

    列5: 默认匹配为模糊匹配(包含关系)
    grep "168" test.txt 

    列6: 绝对匹配(相等关系)
    grep "^192.168$" test.txt 

    列7: 匹配ip
      #-E:将样式为延伸的正则表达式来使用
      #[0-9]:匹配的参数
      #{1,3}:出现的次数
      grep -E "([0-9]{1,3}.){3}[0-9]{1,3}" test.txt 
      #或者如下语句,作用是一样的
      cat test.txt |grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"

    列8: 多级匹配

    grep -E 等于egrep

      #'||':全部打印,标红匹配内容
      #'|' :打印匹配的行内容
      # -n 打印行号
      egrep -n "11|kongdesheng" test.txt
      #或者
      grep -E "11|kongdesheng" test.txt

  • 相关阅读:
    django操作mysql
    Pycharm 社区版本Database Navigator 安装教程
    自定义报告,用Java写一个html文件
    java中javamail收发邮件实现方法
    Java中的File操作总结
    JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
    画面分割和偏移计算
    MapView源代码
    MapUnit单元格源代码
    RecyclerView
  • 原文地址:https://www.cnblogs.com/KdeS/p/13214239.html
Copyright © 2020-2023  润新知