目录

1 shell介绍及命令技巧 4

1.1 shell介绍 4

1.2 部分命令技巧 4

1.3获取命令输出结果 4

2 快捷键 4

3 变量相关 5

3.1 变量基础 5

3.2 shell的特殊变量 6

3.2.1位置变量 6

3.2.2 进程状态变量 6

3.2.3 alias unalias 6

4 数据运算 6

4.1 整数运算 6

4.2 小数运算 7

4.3 计算器实例 7

5 字符串处理 7

5.1 字符串截取 7

5.2 字符串的替换 8

5.3 字符串匹配删除 8

5.4 变量初始值处理 9

6 正则表达式 9

6.1 基本正则表达式 9

6.2 扩展正则表达式 10

7 判断语句 11

7.1 条件测试 11

7.2 整数测试表达式 11

7.3 字符测试表达式 11

7.4文件/目录判断表达式 12

7.5扩展:一行执行多条命令 12

8 If 选择结构 12

8.1 单分支 12

8.2 双分支 12

8.3 多分支 12

9 case分支语句 13

10 循环语句 13

10.1 for循环结构 13

10.2 while循环结构 13

10.3 循环的中断与退出 14

11 函数 14

12 expect编程 14

13 sed 16

13.1 sed的基本选项 16

13.2 sed工具的条件 16

13.3 sed指令集合 17

14 awk 19

14.1 基本用法 19

14.2 选项 19

14.3 常用内置变量 19

14.4练习 19

14.5条件 20

14.6 awk流程控制 21

14.7 awk数组的使用 22

1 shell介绍及命令技巧

1.1 shell介绍

  1. "#!"又叫幻数,在shell脚本中必须在第一行是指定解释器,在其他行就是注释
  2. #!/usr/bin/expect  非交互式语言
  3. 每个打开的会话是一个shell,在这个会话中运行的脚本是这个shell的子shell(子进程),使用source或者是. 执行脚本时,脚本中所有的语句将作为shell当前父shell脚本进程的一部分运行,此时脚本自身的变量的值或者函数等的返回值会传递到当前的父shell脚本中使用

1.2 部分命令技巧

  1. stty  设置当前连接终端的参数    
  2.     stty -echo 设置输入无回显,如passwd修改密码是可用      
  3.     stty echo   恢复输入回显      
  4. ping  设置ping的次数,间隔和等待时间可缩短脚本运行时间    
  5.     -c4   ping4次      
  6.     -i0.1 ping的间隔为0.1秒,默认为1秒      
  7.     -W1   设置等待回应时间,默认5秒      
  8. echo    
  9.     -n  输出后不换行    
  10.     -e  extend扩展功能    
  11.     echo -e ”\033[32mOK\033[0m“        
  12.         固定格式\033[启用颜色功能,OK显示为绿色,      
  13.         后面的\033[0m是把命令行设置回正常颜色      
  14.         0x是样式      
  15.         3x是字体色      
  16.         4X是背景色      
  17.         10x是高亮色      
  18. ssh  设置远程连接时不检查本地的hostkey      
  19.     ssh -o StrictHostKeyChecking=no 192.168.4.6      
  20. column -t  命令结果以tab键对齐    
  21.  cat /etc/passwd |awk -F':' '{print $1,$3,$5}'|column -t  

1.3获取命令输出结果

  1. 使用``将命令括起来  
  2. 使用$()将命令括起来  

2 快捷键

  1. Ctrl+d          键盘输入结束或退出终端    
  2. Ctrl+s          暂定当前程序,暂停后按下任意键恢复运行    
  3. Ctrl+z          将当前程序暂定并放到后台,恢复到前台为命令fg    
  4. Ctrl+a          将光标移至输入行头,相当于Home键    
  5. Ctrl+e          将光标移至输入行末,相当于End键    
  6. Ctrl+k          删除从光标所在位置到行末    
  7. Alt+Backspace   向前删除一个单词    
  8. Shift+PgUp      将终端显示向上滚动    
  9. Shift+PgDn      将终端显示向下滚动    

3 变量相关

3.1 变量基础

  1. env 显示系统变量  
  2. set 显示所有变量  
  3. read -p 提示信息  变量名  
  4. export  定义全局变量  
  5. export设置的变量用unset取消掉    
  6.     export MYNAME=DAZUO    
  7.     unset MYNAME  
  8. declare或typeset(bash内部命令)可以用来限定变量的属性  
  9.     declare -x var=value  与export  var=value等同      
  10.     -x export 申明变量为环境变量    
  11.     -i 整数变量    
  12.     -a 数组    
  13.     -f 函数    
  14.     -r 只读变量
  15. local  限定变量的使用范围  
  16.     function中的变量为局部变量,一般用local声明  
  17.     [root@bj_manager test]# cat ttt    
  18.     #!/bin/sh    
  19.     a() {    
  20.     local s=1    
  21.     echo $s    
  22.     }    
  23.     b() {    
  24.      s=2    
  25.     echo $s    
  26.     }    
  27.     s=0    
  28.     a    
  29.     echo $s    
  30.     b    
  31.     echo $s    
  32.     [root@bj_manager test]# ./ttt    
  33.     1    
  34.     0    
  35.     2    
  36.     2    

3.2 shell的特殊变量

3.2.1位置变量

  1. $0 获取当前执行的shell脚本的文件名,包括路径  
  2.     dirname  "$0" 取$0的目录    
  3.     basename "$0" 取$0的文件名
  4. $n 获取当前执行的shell脚本的第n个参数  
  5.     n=1..9   n=0时表示脚本的文件名,    
  6.              如果n大于9,用大括号括起来${10}  
  7. $* 获取当前shell的所有参数  
  8.   将所有的命令行参数视为单个字符串,相当于"$1$2$3..."    
  9. $# 获取当前shell命令行中的参数的总个数  
  10.     $#带单个变量表示获取变量的长度    
  11. $@ 表示这个程序所有的参数 "$1" "$2" "$3" "..."  
  12.     将参数传递给其他程序的最佳方式,会保留所有内嵌在参数里
  13. 的任何空白    

3.2.2 进程状态变量

  1. $$  获取当前shell的进程号(PID)  
  2. $!  执行的上一条指令的PID  上一个后台运行进程的进程号  
  3. $_  上一个命令或脚本的最后一个参数  
  4. $?  上一个命令执行的返回值  
  5.     0 表示运行成功    
  6.     2 没有权限    
  7.     1-125  表示运行失败,如参数传递错误等    
  8.     126  找到了命令  但是无法运行    
  9.     127  未找到要运行的命令    
  10.     >128 命令被系统强制结束  

3.2.3 alias unalias

  1. 设置命令别名与取消命令别名  

4 数据运算

4.1 整数运算

  1. expr  能运算整数和变量 
  2. 运算符两侧必须有空格
  3. 计算乘法时使用*必须转义  
  4.       +   -   *  /(除法) %(取余) **乘方运算  
  5.     eg : expr  78 + 64        
  6.          X=10 ;expr $X + 10       
  7.          expr 2 \* 3     
  8. $[] $(()) 能运算整数和变量
  9. 运算符两侧无需空格
  10. 乘法*无需转义 
  11.     eg: $[2*3]      
  12.         a=10,b=2, $[a+b]     
  13.         $[2**3]    
  14. let  可用于修改变量的值 let属于bash内部命令,运算效率较低  
  15.     [root@ ~]# let X++ ; echo $X      # X++(X=X+1)    
  16.     101    
  17.     [root@ ~]# let X-- ; echo $X      # X--(X=X-1)    
  18.     100    
  19.     [root@ ~]# let X+=78;echo $X      # X+=78(X=X+78)    
  20.     178    
  21.     [root@ ~]# let X-=78;echo $X      # X-=78(X=X-78)    
  22.     100    
  23.     [root@ ~]# let X*=78;echo $X      # X*=78(X=X*78)    
  24.     7800    
  25.     [root@ ~]# let X/=78;echo $X      # X/=78(X=X/78)    
  26.     100    
  27.     [root@ ~]# let X%=78;echo $X      # X%=78(X=X%78)    
  28.     22    

4.2 小数运算

  1. bc  结果默认不保留小数点后数字
  2. 如需保留需指定scale=n(如scale=2,结果保留小数点后2位)
  3. 也可以做逻辑判断  
  4.     eg:echo  "1+1" | bc              
  5.         echo "1.1+1.1;2.2+2.2" |bc         
  6.         echo "scale=2;2/10" |bc        
  7.         echo "1>2" |bc    

4.3 计算器实例

  1. echo $(($1))  
  2. 或者echo $(($1$2$3))  

5 字符串处理

5.1 字符串截取

  1. ${变量名:起始位置:截取长度};第一位计数为0  
  2. ]# phone=18573157319    
  3. ]# echo ${phone:0:6}#从第一位开始取6位,默认0可省略    
  4.    185731    
  5. ##echo  ${phone::6}与echo ${phone:6}的区别    
  6. ##重要:前者是省略了从1位开始截取,截取6位,
  7. 结果位185731,后者是从第7位开始截取到变量结束    
  8.    ]# echo ${#phone}  # $#统计变量个数,长度    
  9.    11
  10. expr substr “$变量名”  起始位置  截取长度
  11. 第一位计数为1,1可省略  
  12.    ]# expr substr “$phone” 1 3    
  13.    185    
  14.    ]# expr substr "$phone"  3  #同上    
  15. echo $变量名 | cut -b  起始位置-结束位置   第一位计数为1  
  16.    ]# echo $phone | cut -b 1-3  #截取第1到3位    
  17.    185    
  18.    ]# echo $phone | cut -b 3,5,6  #截取第3,5,6位    
  19.    531  

5.2 字符串的替换

  1. ${变量名/old/new}   替换第一个匹配值 
  2. ${变量名//old/new}  替换所有匹配值  
  3. ]$ phone=18573197315    
  4. ]$echo ${phone/3/4}#只是显示,原变量phone的值没有改变    
  5.    18574197315    
  6.    ]$ phone=${phone/3/4}   #修改原变量值    

5.3 字符串匹配删除

  1. 从左到右  最短匹配删除  ${变量名#匹配信息}     
  2.          最长匹配删除  ${变量名##匹配信息}  
  3.     ]$ A=`head -1 /etc/passwd`    
  4.     ]$ echo $A    
  5.     root:x:0:0:root:/root:/bin/bash    
  6.     ]$ echo ${A#root}    
  7.     :x:0:0:root:/root:/bin/bash    
  8.     ]$ echo ${A#*:}    
  9.     x:0:0:root:/root:/bin/bash    
  10.     ]$ echo ${A##*:}  #最长匹配删除    
  11.     /bin/bash     
  12. 从右到左 最短匹配删除  ${变量名%匹配信息}    
  13.         最长匹配删除  ${变量名%%匹配信息}  
  14.     ]$ echo ${A%:*}      
  15.     root:x:0:0:root:/root      
  16.     ]$ echo ${A%%:*}      
  17.     root      
  18. 批量修改文件扩展名  
  19.     将所有的.doc文件改为.txt文件  
  20.     for i in ·ls *.doc  
  21.     do    
  22.     mv $i ${i%.*}.txt    
  23.     done     

5.4 变量初始值处理

  1. ${var:-word}  如果变量有值,则返回变量值
  2. 如果没有值,则返回word值  
  3.     [dazuo@localhost 1]$ dazuo=${test:-xiaozuo}    
  4.     [dazuo@localhost 1]$ echo $test  #test变量未定义    
  5.     [dazuo@localhost 1]$ echo $dazuo    
  6.     xiaozuo    
  7.     [dazuo@localhost 1]$    
  8. ${value:=word} =与-类似,只是当value未定义或者值为空的时候,
  9. 在返回word的值的同时将word值赋给value  
  10.     [dazuo@localhost 1]$ echo $dazuo    
  11.     xiaozuo    
  12.     [dazuo@localhost 1]$ echo $test    
  13.     [dazuo@localhost 1]$ dazuo=${test:=xiaozuo}    
  14.     [dazuo@localhost 1]$ echo $dazuo    
  15.     xiaozuo    
  16.    [dazuo@localhost 1]$ echo $test # =同时也给test赋值    
  17.     xiaozuo    
  18. ${value:?"not defined"}
  19. 如果变量名存在且非null,则返回变量的值,
  20. 否则显示变量名:message  并退出当前的命令或者脚本  
  21.     用途:用于捕捉由于变量未定义而导致的错误,并退出程序  
  22. ${value:+word} 如果变量名存在且为非null,则返回word   
  23. 否则返回null  
  24.     用途:测试变量是否存在  

6 正则表达式

  1. 又称规则表达式  
  2. 命令行中?匹配单个字符   *匹配任意多个字符(包括0个)  

6.1 基本正则表达式

  1. 基本正则兼容性强,几乎所有软件都支持,书写麻烦  

  1. ^  匹配行首  
  2. $  匹配行尾  
  3. []  集合,匹配集合中的任意单个字符  
  4.     [a-z] 匹配a到z之间的所有字符  
  5.     [a-fmy9]==[abcdefmy9]  
  6.     [a-fmy0-3]=[abcdefmy0123]
  7. [^] 对集合取反  
  8. .   匹配任意单个字符  
  9. *   匹配前一个字符任意次数,包括0次【*不允许单独使用】  
  10. \{n,m\}  匹配前一个字符n到m次  
  11.     [omc@omc6vm8 FM]$ grep PL\{2,7\} dn_cell.txt    
  12.     [omc@omc6vm8 FM_]$ grep "PL\{2,7\}" dn_cell.txt  
  13.     PLLLLMN6-PLMN/MRBTS-617583/LNBTS-617583/LNCEL-4    
  14. \{n,\}   匹配前一个字符n次以上  
  15. \{n\}    匹配前一个字符出现n次  
  16. \(\)     保留  
  17.     (abc)(ttt)(123) 相当于复制abc  ttt  123  
  18. 使用时\3表示粘贴第三个()内的123  

6.2 扩展正则表达式

  1. 简化基本正则,扩展新的功能
  2. 相较于基本正则,兼容性稍差
  3. grep 不支持扩展正则  egrep支持或者grep -E

  1. +   最少匹配一次  
  2.     1次以上  
  3. ?  最多匹配一次  
  4.     0次或者1次  
  5. {n,m} 匹配n到m次  
  6. {n,}  {n}  
  7. ()   组合为整体,保留  
  8. |    或者  
  9. \b   单词边界  
  10. [omc@nok2vm7 tmp]$ grep the test.txt     
  11. the asash    
  12. ashjdajksd asjdtheakshasj asdkjshad    
  13. sadkasdh ashdjathe aksjdha    
  14. theasdjha ajsdh    
  15. [omc@nok2vm7 tmp]$ grep the\b test.txt       
  16. [omc@nok2vm7 tmp]$ egrep \bthe\b test.txt     
  17. [omc@nok2vm7 tmp]$ egrep "\bthe\b" test.txt     
  18. the asash    
  19. [omc@nok2vm7 tmp]$ egrep "\bthe" test.txt     
  20. the asash    
  21. theasdjha ajsdh    
  22. [omc@nok2vm7 tmp]$ egrep "the\b" test.txt     
  23. the asash    
  24. sadkasdh ashdjathe aksjdha    
  25. [omc@nok2vm7 tmp]$    

7 判断语句

7.1 条件测试

  1. 用于字符串,数字,文件/目录测试

  1. 格式1:test<测试表达式>  
  2. 格式2:[测试表达式] 
  3. 方括号两边必须有至少一个空格 
  4. 格式3:[[测试表达式]]  
  5.       格式1与2是等价的  
  6.      格式3为扩展的test命令 
  7. &&,||,<,>等操作可以用于[[]]中但是不能用于[]中
  8. 整数二元比较操作符    
  9. []     在[[]]和(())中使用  
  10. -eq          ==  
  11. -ne          !=  
  12. -gt          >  
  13. -ge          >=  
  14. -lt          <  
  15. -le          <=  
  16. 逻辑操作符  
  17. []     [[]]  
  18. -a     &&  
  19. -o     ||  
  20. !       !   

7.2 整数测试表达式

  1. -eq   equal 等于  
  2. -ne   not equal   不等于  
  3. -gt   greater than   大于  
  4. -ge   greater or equal   大于等于  
  5. -lt   less  than    小于  
  6. -le   less or equal  小于等于  

7.3 字符测试表达式

  1. -z   是否为空  
  2. -n   是否不为空  
  3. ==   是否相等  
  4. !=   是否不等  

7.4文件/目录判断表达式

  1. -e   exit判断是否存在
  2. -f   file 存在且为普通文件
  3. -d   directory  存在且为目录
  4. -r   read 存在且有read权限  -w -x同理
  5. root对任何文件检测都有r  w权限
  6. 以实际操作为远测,不是ll显示的权限

7.5扩展:一行执行多条命令

  1. A && B    # 仅当A执行成功后才执行B  
  2. A || B    # 仅当A执行失败后才执行B  
  3. A ;B   # 执行A之后再执行B  
  4. A && B|| C # B执行失败或者是没有执行的时候,执行C  
  5. [ a == a ]  && echo Y || echo N  
  6. Y  
  7. [ a == b ] && echo Y || echo N  
  8. N  

8 If 选择结构

8.1 单分支

  1. if 条件测试  
  2. then  
  3. 命令序列  
  4. fi  

8.2 双分支

  1. if 条件测试
  2. then
  3. 命令序列1
  4. else
  5. 命令序列2
  6. fi

8.3 多分支

  1. if 条件测试1
  2. then
  3. 命令序列1
  4. elif  条件测试2
  5. then
  6. 命令序列2
  7. .......
  8. else
  9. 命令序列n
  10. fi

9 case分支语句

  1. case 变量 in  
  2. 模式1)      # 可用|匹配多个  如-n | -N,匹配n或者N  
  3.     命令序列1;;  
  4. 模式2)  
  5.     命令序列2;;  
  6.   ...  ...  
  7. *)  
  8.      默认命令序列  
  9. Esac   
  10. ###[a-Z] 字符判断  [0-9]数字判断

10 循环语句

10.1 for循环结构

  1. for 变量名 in 值列表  
  2. do  
  3.    命令序列  
  4. done  
  5. for ((i=0,i<=10;i++))  
  6. do    
  7.  命令序列  
  8. done  
  9. ###  
  10. {1..5}  或 seq 5均表示从1.到5之前的数  {5..10}==seq 5 10    
  11. 1.for i in {5..10}等同于for i in `seq 5 10`    
  12. echo {..} 不能使用变量  seq中可以使用变量  
  13. ###    

10.2 while循环结构

  1. while 条件测试  
  2. do    
  3.    命令序列  
  4. done  
  5. while:  
  6. do  
  7.    命令序列  
  8. done   
  9. ###死循环极消耗CPU  

10.3 循环的中断与退出

  1. continue  强制结束本次循环  
  2. for i in {1..5}  
  3. do  
  4.     [ $i -eq 3 ] && continue  
  5.     echo $i  
  6. done  
  7. 输出结果  
  8. 1  
  9. 2  
  10. 4  
  11. 5  
  12. break   结束整个循环  
  13. exit    结束整个脚本  

11 函数

  1. 格式1    
  2. function 函数名 {    
  3.    命令序列    
  4.    ......    
  5. }    
  6. 格式2    
  7. 函数名(){    
  8.   命令序列    
  9.    ... ...    
  10. }    
  11. unset 函数名     取消函数  
  12. 系统的函数库   /etc/init.d/functions  
  13. shell的fork炸弹  
  14. #!/bin/sh    
  15. .(){    
  16. .|.&    
  17. }    
  18. .  

12 expect编程

  1. 实现自动交互, 重要!!! expect脚本默认最后一行不执行  
  2. #!/bin/bash    
  3. expect << EOF    
  4. spawn ssh 172.31.7.178    
  5. expect "password" {send "YourPassword\n"}    
  6. expect "#" {send "touch /123.txt\n"}    
  7. expect "#" {send "exit\n"}    
  8. EOF    
  9. 实例:    
  10. #!/bin/sh    
  11. #set -x    
  12. source ../.bashrc    
  13. iOMSID=`echo ${PS1} |  cut -d '-' -f 2 | cut -d ')' -f 1 `    
  14. echo $iOMSID    
  15. userpass='Your Password'    
  16. /usr/bin/expect  <<-EOF    
  17. # ch2git.expect    
  18.  set timeout 30    
  19. #set action [lindex $argv 0]    
  20. set username root    
  21. spawn su $username    
  22. expect "Password:"    
  23. send "$userpass\r"    
  24. send "who\r"     
  25. send " ztopocli -lc  > ~/iOMS_Info/enbstat_connect_$iOMSID.txt \r"    
  26. send " ztopocli -ld   > ~/iOMS_Info/enbstat_discon_$iOMSID.txt \r"    
  27. send "zaho  > ~/iOMS_Info/alarm_active_$iOMSID.txt \r"    
  28. send "exit\r"    
  29. expect eof    
  30. EOF    
  31. \t  tab键    
  32. \n  换行     
  33. \r 回车回到行首  
  34. \n  \r区别如下    
  35. $ echo -e "a\tb\tc\t\nd\te\tf\t"    
  36. a       b       c    
  37. d       e       f    
  38. [root@localhost root]# echo -e "a\tb\tc\t\rd\te\tf\t"    
  39. d       e       f    
  40. [root@localhost root]# echo -e "a\tb\tc\t\rd"    
  41. d       b       c    
  42. [root@localhost root]# echo -e "a\tb\tc\t\rd\tw"    
  43. d       w       c    
  44. [root@localhost root]# echo -e "a\tb\tc\t\rd\tw\te"    
  45. d       w       e    
  46. 如果不希望ssh时出现yes/no的提示,远程时使用如下选项  
  47. ssh -o StrictHostKeyChecking=no serverIP    

13 sed

  1. Stream Editor  流式编辑器  
  2.  -非交互,基于模式匹配过滤及修改文本  
  3.  -逐行处理,并将结果输出到屏幕  
  4.  -可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作  
  5. 用法1:前置命令 | sed [选项]  '条件指令'    
  6. 用法2:sed [选项]  '条件指令'   文件   

13.1 sed的基本选项

  1. -n  屏蔽默认输出,默认sed会输出读取文档的全部内容  
  2. -r  让sed支持扩展正则  
  3. -i  sed直接修改源文件,默认sed只是通过内存临时修改文件内容,对源文件没有影响  
  4. 打印3到6行  
  5. sed -n '3,6p' /etc/passwd  
  6. 打印第6行  
  7. sed -n '6p'  /etc/passwd  
  8. 打印第1行和第3行  
  9. sed -n '1p;3p' /etc/passwd  
  10. 打印第3行以及后面10行  
  11. sed -n '3,+10p' /etc/passwd  
  12. 打印奇数行  从第2行开始,每隔2行打印一次  
  13. sed -n '1~2p' /etc/passwd  
  14. 打印偶数行  从第2行开始,每隔2行打印一次  
  15. sed -n '2~2p' /etc/passwd 

13.2 sed工具的条件

  1. 不设置条件则匹配所有行  
  2. 正则案例  必须将正则表达式放在//里面 用于区分指令和条件  
  3. 打印包含root的行    
  4. sed -n '/root/p' /etc/passwd    
  5. 打印以bash结尾的行    
  6. sed -n '/bash$/p' /etc/passwd 

13.3 sed指令集合

  1. d  删除  
  2. #保留包含xml的行,其他的都删掉   
  3. sed -i '/xml/!d' a.txt    
  4. #删掉所有空行    
  5. sed ‘/^$/d’ a.txt    
  6. s  替换  s/old/new/g  
  7. [omc@omc1vm8 tmp]$ sed  's/2017/xxxx/' test     
  8. xxxx 2011 2019    
  9. xxxx 2017 2019    
  10. xxxx 2017 2017    
  11. [omc@omc1vm8 tmp]$ cat test     
  12. 2017 2011 2019    
  13. 2017 2017 2019    
  14. 2017 2017 2017    
  15. [omc@omc1vm8 tmp]$ sed  's/2017/xxxx/g' test     
  16. xxxx 2011 2019    
  17. xxxx xxxx 2019    
  18. xxxx xxxx xxxx    
  19. [omc@omc1vm8 tmp]$ sed  '1s/2017/xxxx/g' test     
  20. xxxx 2011 2019    
  21. 2017 2017 2019    
  22. 2017 2017 2017    
  23. [omc@omc1vm8 tmp]$ sed  '3s/2017/xxxx/2' test     
  24. 2017 2011 2019    
  25. 2017 2017 2019    
  26. 2017 xxxx 2017    
  27. [omc@omc1vm8 tmp]$ sed  '3s/2017//2' test     
  28. 2017 2011 2019    
  29. 2017 2017 2019    
  30. 2017  2017    
  31. [omc@omc1vm8 tmp]$ sed -n 's/2011/xxxx/p' test     
  32. 2017 xxxx 2019    
  33. [omc@omc1vm8 tmp]$ sed -n 's/2019/xxxx/gp' test     
  34. 2017 2011 xxxx    
  35. 2017 2017 xxxx    
  36. [omc@omc1vm8 tmp]$    
  37. 注意:替换操作的分隔"/"可改用其他字符,如#,&等,便于修改文件路径  
  38. sed 's#/bin/bash#/sbin/sh#g' /etc/passwd    
  39. sed 's9\97\98\99\9\98\99' file  # 将97989替换成9989    
  40. # 删除文件每行的第二个字符和最后一个字符  
  41. [omc@nok1vm8 tmp]$ cat test     
  42. hello the word    
  43. ni hao beijing    
  44. [omc@nok1vm8 tmp]$ sed 's/.//2' test     
  45. hllo the word    
  46. n hao beijing    
  47. [omc@nok1vm8 tmp]$ sed "s/.$//" test     
  48. hello the wor    
  49. ni hao beijin    
  50. sed中()的应用  
  51. # 把beijing替换成ni hao beijing    
  52. [omc@nok1vm8 tmp]$ sed -r  's/(beijing)/ni hao \1/' test    
  53. hello the word      
  54. ni hao ni hao beijing      
  55. # 电话加区号     
  56. [omc@nok1vm8 tmp]$ sed -r 's/(^.)/010\1/' test      
  57. 0102384723      
  58. 0102348728      
  59. 0102348294      
  60. 0108583877      
  61. 0102489787     
  62.  # 第一个字符和最后一个字符对调    
  63. [omc@nok1vm8 tmp]$sed r 's/(^.)(.*)(.$)/\3\2\1/' test       
  64. 3hangsan 238472z      
  65. 8asi 234872l      
  66. 4angwu 234829w      
  67. 7hengliu 858387c      
  68. 7azuo 248978d      
  69. a  匹配行下一行增加  
  70. i  匹配行上一行增加  
  71. c  行修改,整行修改掉  
  72. [omc@nok1vm8 tmp]$ cat test     
  73. zhangsan 2384723    
  74. lasi 2348728    
  75. wangwu 2348294    
  76. chengliu 8583877    
  77. dazuo 2489787    
  78. [omc@nok1vm8 tmp]$ sed '1i xxxx' test     
  79. xxxx    
  80. zhangsan 2384723    
  81. lasi 2348728    
  82. wangwu 2348294    
  83. chengliu 8583877    
  84. dazuo 2489787    
  85. [omc@nok1vm8 tmp]$ sed '1a xxxx' test     
  86. zhangsan 2384723    
  87. xxxx    
  88. lasi 2348728    
  89. wangwu 2348294    
  90. chengliu 8583877    
  91. dazuo 2489787    
  92. [omc@nok1vm8 tmp]$ sed '1c xxxx' test     
  93. xxxx    
  94. lasi 2348728    
  95. wangwu 2348294    
  96. chengliu 8583877    
  97. dazuo 2489787    
  98. r w 与vim中功能一致,h H g G很少使用  
  99. r 读取其他文件并导入到本文件    
  100. r /etc/hosts  #读取/hosts文件内容到本文件    
  101. sed ‘1r /etc/hosts’  a.txt  # a.txt的第一行后导入/etc/hosts文件内容 

14 awk

  1. -创造者:Aho,Weinberger,Kernighan  
  2. -基于模式匹配检查输入文本,逐行处理并输出  
  3. -通常用在shell脚本中,获取指定的数据  
  4. -单独使用时,可对文本数据做统计  

14.1 基本用法

  1. 格式1:前置命令 | awk [选项]  '[条件]{指令}'  
  2. 其中,print是最常用的指令 ,$1表示输出空格和$1;若有多条编 辑指令,可用分号分隔, 默认分隔符为空格或者是制表符(tab)
  3. 格式2:awk [选项]  '[条件]{指令}'  文件  
  4. 格式3:awk  [选项] 'BEGIN{指令}{指令}END{指令}' 文件  
  5. BEGIN{}行前处理,读取文件内容前执行,指令执行一次  
  6. {}逐行处理  读取文件过程中执行,指令执行n次  
  7. ENB{}行后处理,读取文件结束后执行,指令执行1次  

14.2 选项

  1. -F  指定分隔符  
  2. awk -F[:/]  file  # 以:或者/为分隔符   

14.3 常用内置变量

  1. $0  当前处理行的全部内容  
  2. $1  文件第1列  $2  文件第2列  以此类推  
  3. NR  当前行的行号  
  4. NF  文件当前行的列数  

14.4练习

  1. 获取网卡流量  
  2. [omc@omc5vm18 Unused_Data_Delete]$ ifconfig eth0    
  3. eth0      Link encap:Ethernet  HWaddr 00:50:56:A2:76:7F  
  4.           inet addr:172.31.8.60  Bcast:172.31.8.127  Mask:255.255.255.128  
  5.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
  6.           RX packets:38416048666 errors:0 dropped:0 overruns:0 frame:0  
  7.           TX packets:45355568901 errors:0 dropped:0 overruns:0 carrier:0  
  8.           collisions:0 txqueuelen:1000  
  9.           RX bytes:21755256903306 (19.7 TiB)  TX bytes:15345990280065 (.9 TiB)  
  10. [omc@omc5vm18 Unused_Data_Delete]$ ifconfig eth0 | awk -F'[: ]+' '/RX b/{{print $4}}'  
  11. 21755258461973    
  12. [omc@omc5vm18 Unused_Data_Delete]$ ifconfig eth0 | awk -F'[: ]' '/RX b/{{print $13}}'  
  13. 21755261072895    
  14. [omc@omc5vm18 Unused_Data_Delete]$    
  15. 过滤根分区  
  16. [omc@omc5vm18 Unused_Data_Delete]$ df  
  17. Filesystem           1K-blocks      Used Available Use% Mounted on  
  18. /dev/mapper/rootVG-root  
  19.                       15705540   4144748  10756340  28% /  
  20. tmpfs                  2988772         0   2988772   0% /dev/shm      
  21. /dev/sda1               144646     66285     70681  49% /boot  
  22. /dev/mapper/rootVG-tmp  
  23.                        2514736      4056   2379608   1% /tmp      
  24. /dev/mapper/rootVG-var  
  25.                        8125880   4000812   3705640  52% /var      
  26. omc5vm5:/d/oss/global  
  27.                      309501952  44948992 264552960  15% /d/oss/global  
  28. omc5vm5:/home        206289920 163051520  43238400  80% /home      
  29. [omc@omc5vm18 Unused_Data_Delete]$ df  | awk  '/\/$/{print $3}'  
  30. 10756340  

14.5条件

  1. ~  模糊匹配  
  2. [root@omc2vm8 ~]# awk -F: '$1~/root/' /etc/passwd    
  3. root:x:0:0:root:/root:/bin/bash    
  4. [root@omc2vm8 ~]# awk -F: '$7!~/nologin/' /etc/passwd    
  5. 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    
  9. sadmin:x:351:351::/opt/cpf/home/sadmin:/bin/bash    
  10. mhcf:x:569:558::/home/mhcf:/bin/bash    
  11. nokianpo:x:10241:10241::/home/nokianpo:/bin/bash    
  12. boco4a:x:10253:10253::/home/boco4a:/bin/bash    
  13. zjwgzdh:x:10423:10423::/home/zjwgzdh:/bin/bash    
  14. 使用数值/字符串比较设置  
  15. 比较符号:==  等于    
  16.          !=  不等于    
  17.          >   大于     
  18.          >=  大于等于    
  19.          <   小于    
  20.          <=  小于等于  
  21. awk -F: 'NR==3{print}' /etc/passwd    
  22. awk -F: '$1=="root"' /etc/passwd    
  23. 逻辑判断  &&  ||  
  24. awk -F: '$3>=1000 && $3 <= 1005' /etc/passwd    
  25. 数字四则运算  
  26. 可使用未定义的变量,默认初始值为0  
  27. awk 'BEGIN{x++; print x}'    
  28. seq 2020 | awk '$1%4==0 && $1%100!=0'   

14.6 awk流程控制

  1. if分支结构(单分支,双分支,多分枝)  
  2. #单分支    
  3. if(条件){    
  4.    命令    
  5. }    
  6. #双分支    
  7. if(条件){    
  8. 命令    
  9. }    
  10. else{    
  11. 命令    
  12. }    
  13. #多分支    
  14.   if(条件){    
  15. 命令    
  16. }    
  17. else if(条件){    
  18. 命令    
  19. }    

14.7 awk数组的使用

  1. 在一个变量中存储多个值  
  2. # 定义数组:a[0]=11,  a[1]=12    
  3. for (i in a){    
  4. print a[i]    
  5. }    
  6. # 可用任意字符做下标。字母用单引号或双引号括起来    
  7. a['a']=11;a["b"]=11;a["c"]=11    
  8. awk ‘{a[$1]++} END{for (i in a ){print a[i],i}}’  a.txt