Shell脚本⑦awk

目录

一.awk概述

1.awk介绍

2.基本格式

3.工作原理

4.常见的内建变量

二.awk基本操作

1.打印文本内容

(1)打印磁盘使用情况

(2)打印字符串

(3)打印字符串确定文件有多少行

2.根据$n以及NR提取字段

3.根据选项指定分隔符(-F)

(1)打印所有用户名

(2)打印多列内容

(3)打印磁盘已经使用情况(去除%)

(4)取出文本中的IP地址及时间

(5)取出文本中的主机并返回

4.根据关键字提取所在行

(1)提取以root开头的行

(2)提取root所在行

(3)提取nologin结尾的行

5.使用BEGIN输入包含指定字符

6.FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同

7.NF:处理当前行的整行内容

(1)当前处理行的字段个数

(2)打印出每行最后一个字段

(3)打印出每行倒数第二字段

8.NR:当前处理行的行号

(1)当前处理行的行号

(2)NR==n代表行号等于什么

(3)NR%2==0取偶数行

(4)NR%2==1取奇数行

(5)NR==1,NR==4取区间行

(6)取UID数值范围$n>1000

三.试题练习

1.统计/etc/fstab文件中每个文件系统类型出现的次数

2. 统计/etc/fstab文件中每个单词出现的次数

​编辑

3.将某日志文件访问用户的IP地址,在第三列冒号隔开,统计出访问量前十的IP地址

4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字


一.awk概述

1.awk介绍

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

2.基本格式

awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....

3.工作原理

前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

4.常见的内建变量

FS列分隔符。指定每行文本的字段分隔符,默认为空格或制表位。与“-F”作用相同
NF当前处理的行的字段个数
NR当前处理的行的行号
$0当前处理的行的整行内容
$n当前处理行的第n个字段
FILENAME被处理的文件名
RS行分隔符
$NF最后一段
$(NF-1)倒数第二段

二.awk基本操作

1.打印文本内容

  • awk可以将自动将多个空格压缩成一个空格

  • 打印字符串需要加双引号

(1)打印磁盘使用情况
df |awk '{print $5}'

(2)打印字符串
awk '{print "hello"}'

(3)打印字符串确定文件有多少行
awk '{print "hello"}' /etc/fstab 
 
awk '{print "hello"}' /etc/fstab |wc -l
 
cat /etc/fstab |wc -l

2.根据$n以及NR提取字段

ifconfig ens33|sed -n '2p'|awk '{print $2}'

ifconfig ens33 |awk 'NR==2{print $2}'

注意:$n代表提取第几列

3.根据选项指定分隔符(-F)

(1)打印所有用户名
cat /etc/passwd|awk -F":" '{print $1}'
或
cat /etc/passwd|awk -F: '{print $1}'

(2)打印多列内容
cat /etc/passwd|awk -F":" '{print $1,$2}'
 
cat /etc/passwd|awk -F":" '{print $1":"$2}'
 
cat /etc/passwd|awk -F":" '{print $1"+"$2}'

(3)打印磁盘已经使用情况(去除%)
#使用两条awk命令
df|awk '{print $5}'|awk -F% '{print $1}'
 
#使用一次awk命令
df|awk -F"[ %]+" '{print $5}'
 
##也可以使用( |%)代表或者
df|awk -F"( |%)+" '{print $5}'

(4)取出文本中的IP地址及时间
##文本内容##
vim test.txt 
 
58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?
doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1" ""sendfileo
 
 
##提取##
cat test.txt |sed '2d'|awk -F"[[ ]"  '{print $5"\t"$1}'

(5)取出文本中的主机并返回
##文本内容##
vim host.txt 
 
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
 
##提取##
cat host.txt |awk -F "[. ]" '{print $2}' >>host.txt

4.根据关键字提取所在行

(1)提取以root开头的行
cat /etc/passwd |awk -F":" '/^root/{print}' 

(2)提取root所在行
cat /etc/passwd |awk -F: '/root/{print}'

(3)提取nologin结尾的行
cat /etc/passwd |awk -F":" '/nologin$/{print}' 
 
##如果提取/sbin/nologin,则需要\转义/
cat /etc/passwd |awk -F":" '/\/sbin\/nologin$/{print}' 

5.使用BEGIN输入包含指定字符

  • BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;

  • awk再处理指定的文本,之后再执行END模式中指定的动作;

  • END{ } 语句块中,往往会放入打印结果等语句。

#先定义变量x,表示执行多少次
awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd

6.FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同

7.NF:处理当前行的整行内容

(1)当前处理行的字段个数

(2)打印出每行最后一个字段
cat /etc/passwd |awk -F: '{print $NF}'

(3)打印出每行倒数第二字段
cat /etc/passwd |awk -F: '{print $(NF-1)}'

df|awk '{print $(NF-1)}'

8.NR:当前处理行的行号

(1)当前处理行的行号
#NR写在后面则在后面显示行号
#awk  -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8
 
#可以用制表符
awk  -F: '{print $1"\t"NR}' /etc/passwd
root	1
bin  	2
daemon	3
adm  	4
lp	    5
 
#NR写在前面则在前面显示行号
awk  -F: '{print NR"\t"$1}' /etc/passwd
1	root
2	bin
3	daemon
4	adm
5	lp

(2)NR==n代表行号等于什么
awk -F: 'NR==2 {print $1}' /etc/passwd

(3)NR%2==0取偶数行
awk -F: 'NR%2==0 {print $1}' /etc/passwd

(4)NR%2==1取奇数行
awk -F: 'NR%2==1 {print $1}' /etc/passwd

(5)NR==1,NR==4取区间行
awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd

(6)取UID数值范围$n>1000
#取uid大于1000的行
awk -F: '$3>1000 {print}' /etc/passwd
 
 
#取uid大于等于1000的行
awk -F: '$3>=1000 {print}' /etc/passwd

三.试题练习

1.统计/etc/fstab文件中每个文件系统类型出现的次数

cat /etc/fstab |awk '/^[^#]/{print}'|awk '{print $3}'|sort |uniq -c 

2. 统计/etc/fstab文件中每个单词出现的次数

grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort|uniq -c|sort

3.将某日志文件访问用户的IP地址,在第三列冒号隔开,统计出访问量前十的IP地址

cat log.txt |awk -F: '{print $3}' |sort |uniq -c |sort -rn |head

4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|grep -E -o "[0-9]+"

  • 41
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: awk是一种文本处理工具,常用于shell脚本中。它可以读取文本文件,对每一行进行处理,并输出结果。awk的基本语法为: awk 'pattern {action}' file 其中,pattern是一个正则表达式,用于匹配文本中的某些行;action是一个命令序列,用于对匹配到的行进行处理。awk会自动将每一行分割成若干个字段,可以通过$1、$2等变量来访问这些字段。例如,以下命令可以输出文件中第一列的内容: awk '{print $1}' file 除了基本语法外,awk还有很多高级用法,例如可以使用内置函数、变量、数组等。可以参考awk的官方文档或其他教程来学习更多内容。 ### 回答2: awk是一种文本处理工具,在shell脚本中经常用于对数据文件进行处理。它可以对文件进行逐行扫描,并按照指定的规则进行分割、匹配和处理。以下是awkshell脚本中的用法详解: 1. 基本语法 awk 'pattern { command }' filename 其中,pattern是匹配模式,用于匹配文件中的文本;command是要执行的命令,可以是一行或多行。filename是要处理的文件名。 2. 变量 在awk中有很多内置变量可以使用,例如: - $0:表示整行文本 - $1, $2, $3...:表示第一、二、三列文本 - NF:表示当前行的列数 - NR:表示当前行的行号 - FS:表示字段分隔符,默认为制表符或空格 可以使用这些变量来进行数据的处理和统计。 3. 示例 下面是一些常用的awk示例: (1)从文件中抽取出第一列 $ awk '{print $1}' file.txt (2)统计文件中每行的单词数 $ awk '{print NF}' file.txt (3)筛选出文件中包含关键词的行 $ awk '/keyword/' file.txt (4)计算文件中各列的和 $ awk '{sum += $1 + $2 + $3} END {print sum}' file.txt (5)替换文本中的字符串 $ awk '{gsub("oldstring", "newstring")}1' file.txt 4. 总结 awk是一种非常强大的文本处理工具,它能够根据指定的模式从文本中提取信息,并对其进行处理和统计。熟练掌握awk的使用可以让我们更轻松地处理和分析大量文本数据。 ### 回答3: Shell脚本是编程语言之一,它可以利用awk命令来处理和分析文本数据。awk命令是Linux/Unix系统中经常使用的一个工具,可以对文本文件或标准输入数据进行扫描、过滤、处理和分析,从而很好地完成文本处理的任务。 在Shell脚本中,使用awk命令需要按照如下结构: ```bash awk 'commands' filename ``` 其中,`commands`是awk命令的参数,可以是简单的字符串或复杂的处理脚本。`filename`是需要处理和分析的文件名或者通过管道传输的标准输入数据。 awk命令的一些常用参数和语法如下: 1. `awk '{pattern + action}' filename`:在文件中搜索指定的模式或文本,并对匹配模式的行执行指定的操作。 2. `awk '{print $n}' filename`:将文件中的某列数据提取出来进行打印输出,$1表示第一列数据,$2表示第二列数据,以此类推。 3. `awk -F: '{print $1,$3}' filename`:指定文件的分隔符为“:”,然后提取文件的第一列和第三列数据。 4. `awk '{sum+=$1} END {print sum}' filename`:计算文件中的数据列的总和值,并进行输出。 5. `awk '/re/ {print $0}' filename`:搜索指定的正则表达式re,并将匹配的行输出。 6. `awk '{if($1="xxx") print $0}' filename`:对文件中的指定数据列进行筛选,符合条件就进行输出。 以上是awk命令的一些常用参数和语法,值得注意的是,awk命令非常强大,可以完成很多复杂的文本处理和数据分析,几乎可以操作所有的文本数据。所以,对于Shell脚本中的awk用法,需要根据具体的需求和场景进行灵活运用和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值