awk
grep 查
sed 增删改查
awk 按行取列
awk默认分割符:
空格;tab键。多个空格压缩成一个空格
[root@test2 opt]# cat awk.txt 1 2 3 [root@test2 opt]# awk '{print $3}' awk.txt 3
awk的工作原理:
根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出。
awk选项:
-F 指定分隔符,默认就是空格键
-v 变量赋值
内置变量
$#:按行需要取出的第几个字段。
$0:打印所有,展示所有的文本内容(默认)
NR:需要处理的行号
NF:处理行的字段个数,$NF:当前行的最后一个字段
FS:FS和F是一样的,都是指定分隔符,-F:FS='.'
OFS:指定输出内容的分隔符
RS:行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认\n,回车,换行
awk命令格式
awk -F '操作符 {动作}' 处理对象
-F 指定分隔符,如果是空格可以不加
动作:默认就是打印。
打印行号和内容 NR是行号 $0所有内容 [root@test2 opt]# awk '{print NR,$0}' awk.txt 1 one two three 2 four five six 3 seven eight nine
打印指定行
[root@test2 opt]# awk 'NR==3{print}' awk.txt seven eight nine
指定打印几行到几行 逗号隔开
[root@test2 opt]# awk 'NR==1,NR==3{print}' awk.txt one two three four five six seven eight nine
指定打印几行和几行 分号隔开
[root@test2 opt]# awk 'NR==1;NR==3{print}' awk.txt one two three seven eight nine
打印奇偶行
偶数行
[root@test2 opt]# awk 'NR%2==0{print}' awk.txt four five six
奇数行
[root@test2 opt]# awk 'NR%2==1{print}' awk.txt one two three seven eight nine
如何使用指定分隔符
打印几行到几行 的第几列
[root@test2 opt]# awk -F: 'NR==1{print $3};NR==3{print $3}' /etc/passwd 0 1 2
使用awk文本过滤
[root@test2 opt]# awk '/root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
以什么结尾过滤文本
[root@test2 opt]# awk '/bash$/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash wbl:x:1000:1000:wbl:/home/wbl:/bin/bash wbl1:x:1001:1001::/home/wbl1:/bin/bash wbl2:x:1002:1002::/home/wbl2:/bin/bash aaa:x:1003:1003::/home/aaa:/bin/bash bbb:x:1004:1004::/home/bbb:/bin/bash ccc:x:1005:1005::/home/ccc:/bin/bash
BEGIN打印模式
格式
awk ‘BEGIN{...};{...};END{...}’ 文件
BEGIN{...}预先的条件,指定awk命令前的初始化操作
{...}处理条件,如何多初始值进行操作
END{...}处理完之后操作,一般都是打印。
区幂运算
[root@test2 opt]# awk 'BEGIN{print 10*2}' 20 [root@test2 opt]# awk 'BEGIN{print 2**2}' 4 [root@test2 opt]# awk 'BEGIN{print 2^3}' 8
变量赋值 -v
[root@test2 opt]# sh test1.txt 7 [root@test2 opt]# vim test1.txt a=3 b=4 sum=$(awk -v a="$a" -v b="$b" 'BEGIN{print a+b}') echo $sum
区幂运算
[root@test2 opt]# sh test1.txt 输入一个数3 输入一个数4 81 [root@test2 opt]# vim test1.txt read -p "输入一个数" a read -p "输入一个数" b sum=$(awk -v a="$a" -v b="$b" 'BEGIN{print a^b}') echo $sum
指定分隔符
[root@test2 opt]# awk -v FS=":" -v OFS="==" '{print $1,$3}' /etc/passwd
RS以什么分隔符作为换行的标记
[root@test2 opt]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@test2 opt]# echo $PATH | awk -v RS=":" '{print $1}' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin
使用awk进行条件判断打印
[root@test2 opt]# awk -F: '$3>999{print $0}' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin wbl:x:1000:1000:wbl:/home/wbl:/bin/bash
取反
[root@test2 opt]# awk -F: '!($3>5){print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
等于=是赋值 ==是查找
[root@test2 opt]# awk -F: '$3==999{print $0}' /etc/passwd polkitd:x:999:998:User for polkitd:/:/sbin/nologin
awk的精确筛选
$n(>< ==)用于比较数值
$n-"字符串":该字段包含某个字符串
$n!~"字符串":该字段不包含某个字符串
$n=="字符串":该字段等于某个字符串
$n!=="字符串":该字段不等于某个字符串
$n-"字符串":
打印第七列包含bash这个字段的行,取得是行的第一列和最后一列,以:作为分隔符 [root@test2 opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd root /bin/bash wbl /bin/bash
取列不能范围操作 [root@test2 opt]# awk -F: '$7~"bash" {print ($1,$2,$3)}' /etc/passwd root x 0 wbl x 1000
$n== 是精确查找路径要完整
[root@test2 opt]# awk -F: '$7=="/bin/bash" {print ($1,$2,$3)}' /etc/passwd root x 0 wbl x 1000
/etc/passwd 第一列=wbl 且第七列=/bin/bsah
[root@test2 opt]# awk -F: '($1=="wbl")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd wbl /bin/bash 逻辑关系 &&是且 ||是或 [root@test2 opt]# awk -F: '($1=="ntp")||($NF=="/bin/bash") {print $1,$NF}' /etc/passwd root /bin/bash ntp /sbin/nologin wbl /bin/bash
curl
curl是一个强大的命令
获取和发送数据
curl www.baidu.com
curl 192.168.65.10
获取网页内容并且输出
-o 将文件下载到指定的路径
-O 下载文件到本地
-x 发送post请求
-i 可以获取web软件的版本(服务端没有隐藏版本号)
awk 按行取列
awk 精确筛选
awk 运算符
awk如何取小数点几位及小数运算怎么取整
%.2f 取小数点后两位
[root@test2 opt]# sum=$(awk 'BEGIN{printf "%.2f", 1.222+2.222}') [root@test2 opt]# echo $sum 3.44
%.F 取整
[root@test2 opt]# sum=$(awk 'BEGIN{printf "%.F", 1.222+2.222}') [root@test2 opt]# echo $sum 3
面试题
awk的三元素表达
[root@test2 opt]# awk -F: '$3>999{print $0}' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin wbl:x:1000:1000:wbl:/home/wbl:/bin/bash [root@test2 opt]# awk -F: '{if ($3>999){print $0}}' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin wbl:x:1000:1000:wbl:/home/wbl:/bin/bash [root@test2 opt]#
if else 语句
[root@test2 opt]# awk -F: '{num=($3>$4)?$3:$4;{print num,$0}}' /etc/passwd num=($3>$4)?$3:$4; ?就是if :就是else ;就是fi if ($3>$4) then echo $3 else echo $4 fi
取出文件里的主机名
[root@test2 opt]# cat test1.sh | awk -F '[ .]+' '{print $2}' www mail linux ftp blog [root@test2 opt]# cat test1.sh | awk '{print $2}' | awk -F. '{print $1}' www mail linux ftp blog
统计/etc/下的文件的总大小?awk实现
[root@test2 opt]# ll /etc/ | awk '/-/{print sum+=$5} END{print "文件总大小:"sum/1024"M"}' 文件总大小:1112.56M
作业
监控内存 、cpu、硬盘的根目录,超过80%提示用户,写成函数库的形式,每天上午的8.50执行一次脚本。
[root@test2 opt]# df -h | awk 'NR==2{print sum=$5} END{print "占用:"sum"%"}' | tr -d "%" 26 占用:26
[root@test2 opt]# top -b -n 1 | awk 'NR==3{print sum1=$2+$4} END{print "cpu占用总量:"sum1"%"}' 1.5 cpu占用总量:1.5%
[root@test2 opt]# free -m | awk 'NR==2{printf "%.2f", sum2=($3/$2)*100} END{print "内存占用量:"sum2"% 5.93内存占用量:5.93362%
调用
[root@test2 opt]# vim diaoyong.sh . /opt/test1.sh a=`yingpan $sum1` echo "$a" b=`cpu $sum2` echo "$b" c=`neicun $sum3` echo "$c"
函数库
[root@test2 opt]# vim test1.sh yingpan () { sum1=$(df -h | awk 'NR==2{print $5}' |tr -d "%") if [[ $sum1 > 80 ]] then echo "警告!硬盘用量达到:$sum1" else echo "当前硬盘用量:$sum1%" fi } cpu () { sum2=$(top -b -n 1 | awk 'NR==3{print (sum2=$2+$4)}') if [[ $sum2 > 80 ]] then echo "警告!cpu用量达到:$sum2" else echo "当前cpu用量:$sum2%" fi } neicun () { sum3=$(free -m | awk 'NR==2{printf "%.F", ($3/$2)*100}') if [[ $sum3 > 80 ]] then echo "警告!内存占用量:$sum3" else echo "当前内存用量:$sum3%" fi }
执行
[root@test2 opt]# sh diaoyong.sh 当前硬盘用量:26% 当前cpu用量:0% 当前内存用量:6%
以上是实践