系统架构师
·as
shell知识点梳理
字数 13090阅读 711评论 0赞 0
1 shell介绍及命令技巧1 shell介绍及命令技巧
1.1 shell介绍
- "#!"又叫幻数,在shell脚本中必须在第一行是指定解释器,在其他行就是注释
!/usr/bin/expect 非交互式语言
- 每个打开的会话是一个shell,在这个会话中运行的脚本是这个shell的子shell(子进程),使用source或者是. 执行脚本时,脚本中所有的语句将作为shell当前父shell脚本进程的一部分运行,此时脚本自身的变量的值或者函数等的返回值会传递到当前的父shell脚本中使用
1.2 部分命令技巧
- stty 设置当前连接终端的参数
- stty -echo 设置输入无回显,如passwd修改密码是可用
- stty echo 恢复输入回显
- ping 设置ping的次数,间隔和等待时间可缩短脚本运行时间
- -c4 ping4次
- -i0.1 ping的间隔为0.1秒,默认为1秒
- -W1 设置等待回应时间,默认5秒
- echo
- -n 输出后不换行
- -e extend扩展功能
- echo -e ”\033[32mOK\033[0m“
- 固定格式\033[启用颜色功能,OK显示为绿色,
- 后面的\033[0m是把命令行设置回正常颜色
- 0x是样式
- 3x是字体色
- 4X是背景色
- 10x是高亮色
- ssh 设置远程连接时不检查本地的hostkey
- ssh -o StrictHostKeyChecking=no 192.168.4.6
- column -t 命令结果以tab键对齐
- cat /etc/passwd |awk -F':' '{print $1,$3,$5}'|column -t
1.3获取命令输出结果
- 使用``将命令括起来
- 使用$()将命令括起来
2 快捷键
- Ctrl+d 键盘输入结束或退出终端
- Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行
- Ctrl+z 将当前程序暂定并放到后台,恢复到前台为命令fg
- Ctrl+a 将光标移至输入行头,相当于Home键
- Ctrl+e 将光标移至输入行末,相当于End键
- Ctrl+k 删除从光标所在位置到行末
- Alt+Backspace 向前删除一个单词
- Shift+PgUp 将终端显示向上滚动
- 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 单分支
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 && $3 <= 1005' /etc/passwd
- 数字四则运算
- 可使用未定义的变量,默认初始值为0
- awk 'BEGIN{x++; print x}'
- seq 2020 | awk '$1%4==0 && $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 条评论