qhdx07
作者qhdx07·2022-04-25 15:30
系统架构师·as

shell知识点梳理

字数 13090阅读 711评论 0赞 0

1 shell介绍及命令技巧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 变量基础

  • env 显示系统变量
  • set 显示所有变量
  • read -p 提示信息 变量名
  • export 定义全局变量
  • export设置的变量用unset取消掉
  • export MYNAME=DAZUO
  • unset MYNAME
  • declare或typeset(bash内部命令)可以用来限定变量的属性
  • declare -x var=value 与export var=value等同
  • -x export 申明变量为环境变量
  • -i 整数变量
  • -a 数组
  • -f 函数
  • -r 只读变量
  • local 限定变量的使用范围
  • function中的变量为局部变量,一般用local声明
  • [root@bj_manager test]# cat ttt
  • !/bin/sh

  • a() {
  • local s=1
  • echo $s
  • }
  • b() {
  • s=2
  • echo $s
  • }
  • s=0
  • a
  • echo $s
  • b
  • echo $s
  • [root@bj_manager test]# ./ttt
  • 1
  • 0
  • 2
  • 2

3.2 shell的特殊变量

3.2.1位置变量

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

3.2.2 进程状态变量

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

3.2.3 alias unalias

  • 设置命令别名与取消命令别名

4 数据运算

4.1 整数运算

  • expr 能运算整数和变量
  • 运算符两侧必须有空格
  • 计算乘法时使用*必须转义
        • /(除法) %(取余) **乘方运算
  • eg : expr 78 + 64
  • X=10 ;expr $X + 10
  • expr 2 * 3
  • $[] $(()) 能运算整数和变量
  • 运算符两侧无需空格
  • 乘法*无需转义
  • eg: $[2*3]
  • a=10,b=2, $[a+b]
  • $[2**3]
  • let 可用于修改变量的值 let属于bash内部命令,运算效率较低
  • [root@ ~]# let X++ ; echo $X # X++(X=X+1)
  • 101
  • [root@ ~]# let X-- ; echo $X # X--(X=X-1)
  • 100
  • [root@ ~]# let X+=78;echo $X # X+=78(X=X+78)
  • 178
  • [root@ ~]# let X-=78;echo $X # X-=78(X=X-78)
  • 100
  • [root@ ~]# let X=78;echo $X # X=78(X=X*78)
  • 7800
  • [root@ ~]# let X/=78;echo $X # X/=78(X=X/78)
  • 100
  • [root@ ~]# let X%=78;echo $X # X%=78(X=X%78)
  • 22 ​

4.2 小数运算

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

4.3 计算器实例

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

5 字符串处理

5.1 字符串截取

  • ${变量名:起始位置:截取长度};第一位计数为0
  • ]# phone=18573157319
  • ]# echo ${phone:0:6}#从第一位开始取6位,默认0可省略
  • 185731
  • echo ${phone::6}与echo ${phone:6}的区别

  • 重要:前者是省略了从1位开始截取,截取6位,

  • 结果位185731,后者是从第7位开始截取到变量结束
  • ]# echo ${#phone} # $#统计变量个数,长度
  • 11
  • expr substr “$变量名” 起始位置 截取长度
  • 第一位计数为1,1可省略
  • ]# expr substr “$phone” 1 3
  • 185
  • ]# expr substr "$phone" 3 #同上
  • echo $变量名 | cut -b 起始位置-结束位置 第一位计数为1
  • ]# echo $phone | cut -b 1-3 #截取第1到3位
  • 185
  • ]# echo $phone | cut -b 3,5,6 #截取第3,5,6位
  • 531

5.2 字符串的替换

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

5.3 字符串匹配删除5.3 字符串匹配删除

  • 从左到右 最短匹配删除 ${变量名#匹配信息}
  • 最长匹配删除 ${变量名##匹配信息}
  • ]$ A=head -1 /etc/passwd
  • ]$ echo $A
  • root:x:0:0:root:/root:/bin/bash
  • ]$ echo ${A#root}
  • :x:0:0:root:/root:/bin/bash
  • ]$ echo ${A#*:}
  • x:0:0:root:/root:/bin/bash
  • ]$ echo ${A##*:} #最长匹配删除
  • /bin/bash
  • 从右到左 最短匹配删除 ${变量名%匹配信息}
  • 最长匹配删除 ${变量名%%匹配信息}
  • ]$ echo ${A%:*}
  • root:x:0:0:root:/root
  • ]$ echo ${A%%:*}
  • root
  • 批量修改文件扩展名
  • 将所有的.doc文件改为.txt文件
  • for i in ·ls *.doc
  • do
  • mv $i ${i%.*}.txt
  • done

5.4 变量初始值处理

  • ${var:-word} 如果变量有值,则返回变量值
  • 如果没有值,则返回word值
  • [dazuo@localhost 1]$ dazuo=${test:-xiaozuo}
  • [dazuo@localhost 1]$ echo $test #test变量未定义
  • [dazuo@localhost 1]$ echo $dazuo
  • xiaozuo
  • [dazuo@localhost 1]$
  • ${value:=word} =与-类似,只是当value未定义或者值为空的时候,
  • 在返回word的值的同时将word值赋给value
  • [dazuo@localhost 1]$ echo $dazuo
  • xiaozuo
  • [dazuo@localhost 1]$ echo $test
  • [dazuo@localhost 1]$ dazuo=${test:=xiaozuo}
  • [dazuo@localhost 1]$ echo $dazuo
  • xiaozuo
  • [dazuo@localhost 1]$ echo $test # =同时也给test赋值
  • xiaozuo
  • ${value:?"not defined"}
  • 如果变量名存在且非null,则返回变量的值,
  • 否则显示变量名:message 并退出当前的命令或者脚本
  • 用途:用于捕捉由于变量未定义而导致的错误,并退出程序
  • ${value:+word} 如果变量名存在且为非null,则返回word
  • 否则返回null
  • 用途:测试变量是否存在

6 正则表达式6 正则表达式

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

6.1 基本正则表达式6.1 基本正则表达式

  • 基本正则兼容性强,几乎所有软件都支持,书写麻烦
  • ^ 匹配行首
  • $ 匹配行尾
  • [] 集合,匹配集合中的任意单个字符
  • [a-z] 匹配a到z之间的所有字符
  • [a-fmy9]==[abcdefmy9]
  • [a-fmy0-3]=[abcdefmy0123]
  • [^] 对集合取反
  • . 匹配任意单个字符
    • 匹配前一个字符任意次数,包括0次【*不允许单独使用】
  • \{n,m\} 匹配前一个字符n到m次
  • [omc@omc6vm8 FM]$ grep PL\{2,7\} dn_cell.txt
  • [omc@omc6vm8 FM_]$ grep "PL\{2,7\}" dn_cell.txt
  • PLLLLMN6-PLMN/MRBTS-617583/LNBTS-617583/LNCEL-4
  • \{n,\} 匹配前一个字符n次以上
  • \{n\} 匹配前一个字符出现n次
  • \(\) 保留
  • (abc)(ttt)(123) 相当于复制abc ttt 123
  • 使用时\3表示粘贴第三个()内的123

6.2 扩展正则表达式6.2 扩展正则表达式

  • 简化基本正则,扩展新的功能
  • 相较于基本正则,兼容性稍差
  • grep 不支持扩展正则 egrep支持或者grep -E
    • 最少匹配一次
  • 1次以上
  • ? 最多匹配一次
  • 0次或者1次
  • {n,m} 匹配n到m次
  • {n,} {n}
  • () 组合为整体,保留
  • | 或者
  • \b 单词边界
  • [omc@nok2vm7 tmp]$ grep the test.txt
  • the asash
  • ashjdajksd asjdtheakshasj asdkjshad
  • sadkasdh ashdjathe aksjdha
  • theasdjha ajsdh
  • [omc@nok2vm7 tmp]$ grep the\b test.txt
  • [omc@nok2vm7 tmp]$ egrep \bthe\b test.txt
  • [omc@nok2vm7 tmp]$ egrep "\bthe\b" test.txt
  • the asash
  • [omc@nok2vm7 tmp]$ egrep "\bthe" test.txt
  • the asash
  • theasdjha ajsdh
  • [omc@nok2vm7 tmp]$ egrep "the\b" test.txt
  • the asash
  • sadkasdh ashdjathe aksjdha
  • [omc@nok2vm7 tmp]$

7 判断语句

7.1 条件测试

  • 用于字符串,数字,文件/目录测试
  • 格式1:test<测试表达式>
  • 格式2:[测试表达式]
  • 方括号两边必须有至少一个空格
  • 格式3:[[测试表达式]]
  • 格式1与2是等价的
  • 格式3为扩展的test命令
  • &&,||,<,>等操作可以用于[[]]中但是不能用于[]中
  • 整数二元比较操作符
  • [] 在[[]]和(())中使用
  • -eq ==
  • -ne !=
  • -gt >
  • -ge >=
  • -lt <
  • -le <=
  • 逻辑操作符
  • [] [[]]
  • -a &&
  • -o ||
  • ! !
  • 7.2 整数测试表达式
  • -eq equal 等于
  • -ne not equal 不等于
  • -gt greater than 大于
  • -ge greater or equal 大于等于
  • -lt less than 小于
  • -le less or equal 小于等于

7.3 字符测试表达式7.3 字符测试表达式

  • -z 是否为空
  • -n 是否不为空
  • == 是否相等
  • != 是否不等

7.4文件/目录判断表达式

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

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

  • A && B # 仅当A执行成功后才执行B
  • A || B # 仅当A执行失败后才执行B
  • A ;B # 执行A之后再执行B
  • A && B|| C # B执行失败或者是没有执行的时候,执行C
  • [ a == a ] && echo Y || echo N
  • Y
  • [ a == b ] && echo Y || echo N
  • N

8 If 选择结构

8.1 单分支

  • if 条件测试
  • then
  • 命令序列
  • fi

8.2 双分支

  • if 条件测试
  • then
  • 命令序列1
  • else
  • 命令序列2
  • fi

8.3 多分支

  • if 条件测试1
  • then
  • 命令序列1
  • elif 条件测试2
  • then
  • 命令序列2
  • .......
  • else
  • 命令序列n
  • fi

9 case分支语句9 case分支语句

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

10 循环语句

10.1 for循环结构

  • for 变量名 in 值列表
  • do
  • 命令序列
  • done
  • for ((i=0,i<=10;i++))
  • do
  • 命令序列
  • done
  • {1..5} 或 seq 5均表示从1.到5之前的数 {5..10}==seq 5 10
  • 1.for i in {5..10}等同于for i in seq 5 10
  • echo {..} 不能使用变量 seq中可以使用变量

10.2 while循环结构

  • while 条件测试
  • do
  • 命令序列
  • done
  • while:
  • do
  • 命令序列
  • done
  • 死循环极消耗CPU

10.3 循环的中断与退出

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

11 函数11 函数

  • 格式1
  • function 函数名 {
  • 命令序列
  • ......
  • }
  • 格式2
  • 函数名(){
  • 命令序列
  • ... ...
  • }
  • unset 函数名 取消函数
  • 系统的函数库 /etc/init.d/functions
  • shell的fork炸弹
  • !/bin/sh

  • .(){
  • .|.&
  • }
  • .

12 expect编程

  • 实现自动交互, 重要!!! expect脚本默认最后一行不执行
  • !/bin/bash

  • expect << EOF
  • spawn ssh 172.31.7.178
  • expect "password" {send "YourPassword\n"}
  • expect "#" {send "touch /123.txt\n"}
  • expect "#" {send "exit\n"}
  • EOF
  • 实例:
  • !/bin/sh

  • set -x

  • source ../.bashrc
  • iOMSID=echo ${PS1} | cut -d '-' -f 2 | cut -d ')' -f 1
  • echo $iOMSID
  • userpass='Your Password'
  • /usr/bin/expect <<-EOF
  • ch2git.expect

  • set timeout 30
  • set action [lindex $argv 0]

  • set username root
  • spawn su $username
  • expect "Password:"
  • send "$userpass\r"
  • send "who\r"
  • send " ztopocli -lc > ~/iOMS_Info/enbstat_connect_$iOMSID.txt \r"
  • send " ztopocli -ld > ~/iOMS_Info/enbstat_discon_$iOMSID.txt \r"
  • send "zaho > ~/iOMS_Info/alarm_active_$iOMSID.txt \r"
  • send "exit\r"
  • expect eof
  • EOF
  • \t tab键
  • \n 换行
  • \r 回车回到行首
  • \n \r区别如下
  • $ echo -e "a\tb\tc\t\nd\te\tf\t"
  • a b c
  • d e f
  • [root@localhost root]# echo -e "a\tb\tc\t\rd\te\tf\t"
  • d e f
  • [root@localhost root]# echo -e "a\tb\tc\t\rd"
  • d b c
  • [root@localhost root]# echo -e "a\tb\tc\t\rd\tw"
  • d w c
  • [root@localhost root]# echo -e "a\tb\tc\t\rd\tw\te"
  • d w e
  • 如果不希望ssh时出现yes/no的提示,远程时使用如下选项
  • ssh -o StrictHostKeyChecking=no serverIP

13 sed

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

13.1 sed的基本选项

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

13.2 sed工具的条件

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

13.3 sed指令集合

  • d 删除
  • 保留包含xml的行,其他的都删掉

  • sed -i '/xml/!d' a.txt
  • 删掉所有空行

  • sed ‘/^$/d’ a.txt
  • s 替换 s/old/new/g
  • [omc@omc1vm8 tmp]$ sed 's/2017/xxxx/' test
  • xxxx 2011 2019
  • xxxx 2017 2019
  • xxxx 2017 2017
  • [omc@omc1vm8 tmp]$ cat test
  • 2017 2011 2019
  • 2017 2017 2019
  • 2017 2017 2017
  • [omc@omc1vm8 tmp]$ sed 's/2017/xxxx/g' test
  • xxxx 2011 2019
  • xxxx xxxx 2019
  • xxxx xxxx xxxx
  • [omc@omc1vm8 tmp]$ sed '1s/2017/xxxx/g' test
  • xxxx 2011 2019
  • 2017 2017 2019
  • 2017 2017 2017
  • [omc@omc1vm8 tmp]$ sed '3s/2017/xxxx/2' test
  • 2017 2011 2019
  • 2017 2017 2019
  • 2017 xxxx 2017
  • [omc@omc1vm8 tmp]$ sed '3s/2017//2' test
  • 2017 2011 2019
  • 2017 2017 2019
  • 2017 2017
  • [omc@omc1vm8 tmp]$ sed -n 's/2011/xxxx/p' test
  • 2017 xxxx 2019
  • [omc@omc1vm8 tmp]$ sed -n 's/2019/xxxx/gp' test
  • 2017 2011 xxxx
  • 2017 2017 xxxx
  • [omc@omc1vm8 tmp]$
  • 注意:替换操作的分隔"/"可改用其他字符,如#,&等,便于修改文件路径
  • sed 's#/bin/bash#/sbin/sh#g' /etc/passwd
  • sed 's9\97\98\99\9\98\99' file # 将97989替换成9989
  • 删除文件每行的第二个字符和最后一个字符

  • [omc@nok1vm8 tmp]$ cat test
  • hello the word
  • ni hao beijing
  • [omc@nok1vm8 tmp]$ sed 's/.//2' test
  • hllo the word
  • n hao beijing
  • [omc@nok1vm8 tmp]$ sed "s/.$//" test
  • hello the wor
  • ni hao beijin
  • sed中()的应用
  • 把beijing替换成ni hao beijing

  • [omc@nok1vm8 tmp]$ sed -r 's/(beijing)/ni hao \1/' test
  • hello the word
  • ni hao ni hao beijing
  • 电话加区号

  • [omc@nok1vm8 tmp]$ sed -r 's/(^.)/010\1/' test
  • 0102384723
  • 0102348728
  • 0102348294
  • 0108583877
  • 0102489787
  • 第一个字符和最后一个字符对调

  • [omc@nok1vm8 tmp]$sed r 's/(^.)(.*)(.$)/\3\2\1/' test
  • 3hangsan 238472z
  • 8asi 234872l
  • 4angwu 234829w
  • 7hengliu 858387c
  • 7azuo 248978d
  • a 匹配行下一行增加
  • i 匹配行上一行增加
  • c 行修改,整行修改掉
  • [omc@nok1vm8 tmp]$ cat test
  • zhangsan 2384723
  • lasi 2348728
  • wangwu 2348294
  • chengliu 8583877
  • dazuo 2489787
  • [omc@nok1vm8 tmp]$ sed '1i xxxx' test
  • xxxx
  • zhangsan 2384723
  • lasi 2348728
  • wangwu 2348294
  • chengliu 8583877
  • dazuo 2489787
  • [omc@nok1vm8 tmp]$ sed '1a xxxx' test
  • zhangsan 2384723
  • xxxx
  • lasi 2348728
  • wangwu 2348294
  • chengliu 8583877
  • dazuo 2489787
  • [omc@nok1vm8 tmp]$ sed '1c xxxx' test
  • xxxx
  • lasi 2348728
  • wangwu 2348294
  • chengliu 8583877
  • dazuo 2489787
  • r w 与vim中功能一致,h H g G很少使用
  • r 读取其他文件并导入到本文件
  • r /etc/hosts #读取/hosts文件内容到本文件
  • sed ‘1r /etc/hosts’ a.txt # a.txt的第一行后导入/etc/hosts文件内容

14 awk

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

14.1 基本用法

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

14.2 选项

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

14.3 常用内置变量

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

14.4练习

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

14.5条件

  • ~ 模糊匹配
  • [root@omc2vm8 ~]# awk -F: '$1~/root/' /etc/passwd
  • root:x:0:0:root:/root:/bin/bash
  • [root@omc2vm8 ~]# awk -F: '$7!~/nologin/' /etc/passwd
  • root:x:0:0:root:/root:/bin/bash
  • sync:x:5:0:sync:/sbin:/bin/sync
  • shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  • halt:x:7:0:halt:/sbin:/sbin/halt
  • sadmin:x:351:351::/opt/cpf/home/sadmin:/bin/bash
  • mhcf:x:569:558::/home/mhcf:/bin/bash
  • nokianpo:x:10241:10241::/home/nokianpo:/bin/bash
  • boco4a:x:10253:10253::/home/boco4a:/bin/bash
  • zjwgzdh:x:10423:10423::/home/zjwgzdh:/bin/bash
  • 使用数值/字符串比较设置
  • 比较符号:== 等于
  • != 不等于
  • 大于
  • = 大于等于
  • < 小于
  • <= 小于等于
  • awk -F: 'NR==3{print}' /etc/passwd
  • awk -F: '$1=="root"' /etc/passwd
  • 逻辑判断 && ||
  • awk -F: '$3>=1000 &amp;&amp; $3 <= 1005' /etc/passwd
  • 数字四则运算
  • 可使用未定义的变量,默认初始值为0
  • awk 'BEGIN{x++; print x}'
  • seq 2020 | awk '$1%4==0 &amp;&amp; $1%100!=0'

14.6 awk流程控制

  • if分支结构(单分支,双分支,多分枝)
  • 单分支

  • ​if(条件){
  • 命令
  • }
  • 双分支

  • if(条件){
  • 命令
  • }
  • ​else{
  • 命令
  • }
  • 多分支

  • if(条件){
  • 命令
  • }
  • else if(条件){
  • 命令
  • }

14.7 awk数组的使用

  • 在一个变量中存储多个值
  • 定义数组:a[0]=11, a[1]=12

  • for (i in a){
  • print a[i]
  • }
  • 可用任意字符做下标。字母用单引号或双引号括起来

  • a['a']=11;a["b"]=11;a["c"]=11
  • awk ‘{a[$1]++} END{for (i in a ){print a[i],i}}’ a.txt

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广