文本三剑客awk:
grep 查
sed 增删改查 主要:增改
awk 按行取列
awk
awk默认的分隔符:空格,tab键,多个空格自动压缩为一个。
awk的工作原理:根据指令信息,逐行的读取文本内容,然后按照条件进行格式输出。
awk的选项:
-F 指定分隔符,默认就是空格
-v 变量赋值
内置变量:
$数字 按行需要取出的第几个字段。
$0 打印所有,展示所有的文本内容(默认)
NR 需要处理的行号
NF 处理行的字段个数,
$NF 当前行的最后一个字段
FS FS和F是一样的,都是指定分隔符,
-F: FS=":"
OFS 指定输出内容的分隔符
RS 行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行。
命令格式
awk -F '操作符 {动作}' 处理对象
-F 指定分隔符,如果是空格可以不加
动作:默认就是打印。
打印行号
[root@localhost opt]# awk '{print NR}' awk.txt 1 2 3 4 [root@localhost opt]# awk '{print NR,$0}' awk.txt 1 one two three 2 four five six 3 seven eight nine 4 ten
打印指定行
[root@localhost opt]# awk 'NR==3{print}' awk.txt seven eight nine [root@localhost opt]# awk 'NR==2,NR==4{print}' awk.txt #打印2-4行 four five six seven eight nineten [root@localhost opt]# awk 'NR==2;NR==4{print}' awk.txt #打印2和4行 four five sixten
取第三行的第三列:
[root@localhost opt]# cat awk.txt | awk 'NR==3{print $3}' hpc [root@localhost opt]# cat awk.txt | awk 'NR>=2{print $3}' 3 hpc
如何打印奇偶行
偶数行
[root@localhost opt]# awk 'NR%2==0{print}' awk.txt four five sixten
奇数行:
[root@localhost opt]# awk 'NR%2==1{print}' awk.txt one two three seven eight nine
awk怎么使用文本过滤
[root@localhost opt]# awk '/root/{print}' /etc/passwdroot:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@localhost opt]# awk '/^root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@localhost opt]# awk '/bash$/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash zhang:x:1000:1000:zhang:/home/zhang:/bin/bash dn:x:1001:1001::/home/dn:/bin/bash
使用BEGIN模式打印
awk 'BEGIN{};{};END{}' 文件
BEGIN{...}预先的条件,指定awk命令前的初始化操作
{...}处理条件,如何多初始值进行操作
END{...}处理完之后的操作,一般都是打印。
[root@localhost opt]# awk 'BEGIN{x=0};{x++};END{print x}' awk.txt 4
取幂运算
[root@localhost opt]# awk 'BEGIN{print 3**3}' 27
-v 变量赋值
[root@localhost opt]# vim awk.sh read -p "请输入一个数:" a read -p "请输入$a的幂:" b num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a^b}') echo $num [root@localhost opt]# sh awk.sh 请输入一个数:2 请输入2的幂:3 8
FS
用-v来进行赋值
[root@localhost opt]# awk -v FS=":" -v OFS -v OFS="==" '{print $1,$3}' /etc/passwd
RS
[root@localhost opt]# echo $PATH | awk -v RS=":" '{print $1}' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin
awk的条件判断打印
[root@localhost opt]# awk -F: '$3>999{print $0}' /etc/passwd
第三列等于1000
[root@localhost opt]# awk -F: '$3==1000{print $0}' /etc/passwd zhang:x:1000:1000:zhang:/home/zhang:/bin/bash
面试题:
awk的三元表达式:
if else语句
num=($3>$4)?$3:$4;
? if
: else
; fi
[root@localhost opt]# awk -F: '{num=($3>$4)?$3:$4;{print num,$0}}' /etc/passwd
if ($3>$4) then echo $3 else echo $4 fi
awk的精确筛选:
$n( > < == ) 用于比较数值
$n~"字符串" 该字符包含某个字符串
$n!~"字符串" 该字段不包含某个字符串
$n=="字符串" 该字段等于这个字符串
$n!=="字符串" 该字符不等于某个字符串
$NF 代表最后一个字符串
打印第7列包含bash这个字段的行,取的是行的第一列和最后一列,以:作为分隔符。
[root@localhost opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd root /bin/bash zhang /bin/bash dn /bin/bash
== 是精确查找
~ 是模糊查找
逻辑关系
且和或:
/etc/passwd 第一列等于dn且第七列等于/bin/bash
[root@localhost opt]# awk -F: '($1=="dn")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd dn /bin/bash [root@localhost opt]# awk -F: '($1=="ntp")||($NF=="/bin/bash") {print $1,$NF}' /etc/passwd root /bin/bash ntp /sbin/nologin zhang /bin/bash dn /bin/bash
curl是一个功能强大的命令
获取和发送数据
curl www.baidu.com
curl 192.168.60.20
获取网页内容并且输出
-0 下载文件到本地
-o 将文件下载到指定的路径
-x 发送post请求
-i 可以获取web软件的版本(服务端没有隐藏版本号)
awk按行取列
awk的精确筛选
awk的运算符
练习
取小数点几位以及小数运算怎么取整数。
[root@localhost opt]# num=$(awk 'BEGIN{printf "%.2f", 1.222+2.222}') [root@localhost opt]# echo $num 3.44 [root@localhost opt]# num=$(awk 'BEGIN{printf "%.F", 1.222+2.222}') [root@localhost opt]# echo $num 3
显示有空格有点做为分隔符的第二列
[root@localhost opt]# cat awk1.txt | awk -F'[ .]+' '{print $2}' www mail ftp linux blog
统计/etc下文件的总大小?awk实现
[root@localhost opt]# ll /etc/ | awk '/^-/{print sum+=$5} END{print "文件的总大小是:"sum/1024"M"}' 1070299 文件的总大小是:1045.21M
作业:监控内存,cpu和硬盘的根目录,超过80%提示用户,写成函数库的形式,每天早上的8.50分,执行一次脚本。
[root@localhost opt]# vim hanshuku.sh . /opt/head.sh cpu=$(cpu) neicun=$(neicun) gengmulu=$(gengmulu) echo $cpu echo $neicun echo $gengmulu
[root@localhost opt]# vim head.sh cpu () { sum=$(top -b -n 1 | awk 'NR==3{printf "%.F",$2+$4}') if [[ $sum -ge 80 ]] then echo "cpu使用超过80%了,已经有了$sum%。" else echo "cpu使用了$sum%" fi } neicun () { num=$(free -m | awk 'NR==2{printf "%.F",$3/$2*100}') if [[ $num -ge 80 ]] then echo "内存使用超过80%了,已经有了$num%。" else echo "内存使用了$num%" fi } gengmulu () { c=$(df -h | awk 'NR==2{print $5}' | tr -d "%") if [[ $c -ge 80 ]] then echo "硬盘使用超过80%了,已经有了$c%。" else echo "硬盘使用了$c%" fi }
运行结果:
[root@localhost opt]# sh hanshuku.sh cpu使用了0% 内存使用了12% 硬盘使用了27%
定时任务:
[root@localhost opt]# crontab -e 50 8 * * * sh /opt/hanshuku.sh */1 * * * * sh /opt/hanshuku.sh
定时任务的邮件:
[root@localhost opt]# vim /var/spool/mail/root From root@localhost.localdomain Mon Jun 24 16:16:01 2024 Return-Path: <root@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Received: by localhost.localdomain (Postfix, from userid 0)id 6289060B73E3; Mon, 24 Jun 2024 16:16:01 +0800 (CST) From: "(Cron Daemon)" <root@localhost.localdomain> To: root@localhost.localdomain Subject: Cron <root@localhost> sh /opt/hanshuku.sh Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated Precedence: bulk X-Cron-Env: <XDG_SESSION_ID=261> X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0> X-Cron-Env: <LANG=zh_CN.UTF-8> X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> Message-Id: <20240624081601.6289060B73E3@localhost.localdomain> Date: Mon, 24 Jun 2024 16:16:01 +0800 (CST) cpu使用了8% 内存使用了12% 硬盘使用了27%