文本三剑客——awk 截取+过滤+统计(1)

简介: 文本三剑客——awk 截取+过滤+统计

一、awk是什么?

awk是一种编程及数据操作语言(其名称来自于创始人lfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首字母)

(Gawk is the GNU Project's implementation of the AWK programming language.

gawk - pattern scanning and processing language)三个作者首字母的组合。

1、GNU是什么?

GUN is not uninx。

GUN是一个项目,它的宗旨是构建一个不是uninx的操作系统,项目发起人理查德.斯德尔曼。

操作系统:内核+应用程序+库+解析器等。

内核kernel---linux

2、相关命令选项

awk -F ":":表示接分隔符为":"

~/^luo/:模糊查找以/luo/开头的。并且以luo开头的用户名的长度大于1的。

[root@localhost lianxi]# useradd luoziyao
useradd:用户“luoziyao”已存在
[root@localhost lianxi]# awk -F ": " '$1~/^luo/ && length($1>4) {print $1,$3}' /etc/passwd
luoziyao 2021

3、awk有什么用

过滤+截取+统计

4、awk用在哪里

文本处理(截取和统计)

充值记录:bill.txt

feng 100

feng 200

feng 350

li 200

ma 100000

li 239

li 890

zhang 100

zhang 350

ma 1000

统计每个用户一共充值了多少钱?--》求和,分类统计。

[root@localhost lianxi]# awk '{name[$1]+=$2}END{for (i in name) print i,name[i]}' bill.txt
li 1329
feng 650
zhang 450
ma 101000

①name[1]+=1]+=2 拿1key1字段做key,让2做value,如果数组里有key,就累加,如果没有,初始值是0+value。

②END{for (i in name) print i,name[i]}:END是文件里所有的行都处理完了,最后去执行END部分里的命令。for循环取遍历name数组里的元素(item),i 取name数组里的key,输出key和对应的value。

字段:field --一段文字被分隔符隔开,形成很多段比较短的文字

luoziyao:x:2021:2024::/home/luoziyao:/bin/bash

=====

列: --字段:column

行: row line record

记录:record

一行就是一条记录。

====

二、awk 命令的简要处理流程

使用awk命令可以按照分割符将一行分割为多个列,第一列用11表示,第二列用2表示,依次类推。

awk -F ":":表示接分隔符":",将数据格式化成几段。

$0表示存储的是整行数据

[root@localhost lianxi]# awk -F ":" '{print $1,$3,$7}'  /etc/passwd

1、分隔符

awk截取文本时,会按照指定的分隔符去分隔,默认的分隔符是空格,使用- F可以指定分隔符。

(1)输入分隔符FS/F:input field separate

格式:awk -F 【分隔符】

-F --FS :输入分隔符变量。默认是空白(空格和tab键),可以进行指定。

(2)输出分隔符 OFS:output field separate

OFS=: 输出分隔符变量, 默认是一个空格。就是以什么分隔符来输出内容。

比如:OFS="#':表示以"#"进行分隔

例如:

①输出分隔符以逗号隔开为默认。输出结果为空格隔开。

[root@localhost lianxi]# awk -F ":" '{print $1,$3,$7}' /etc/passwd|head  
root 0 /bin/bash
bin 1 /sbin/nologin

②输出分隔符没有进行分隔,结果输出的也没有没有分隔。

[root@localhost lianxi]# awk -F ":" '{print $1$3$7}' /etc/passwd|head
root0/bin/bash
bin1/sbin/nologin
daemon2/sbin/nologin
adm3/sbin/nologin

③ 输出分隔符以空格隔开,输出的结果也没有分开。

[root@localhost lianxi]# awk -F ":" '{print $1 $3 $7}' /etc/passwd|head
root0/bin/bash
bin1/sbin/nologin
daemon2/sbin/nologin

④ OFS=:output field separate ,指定输入的内容是以“:”分开的,然后指定输出内容的分隔符为"#"。

[root@localhost lianxi]# awk -F ":" 'OFS="#"{print $1,$3,$7}' /etc/passwd|head
root#0#/bin/bash
bin#1#/sbin/nologin

三、awk命令的内置变量

名称 用途
NF 每行$0(最后一个字段)的字段,The number of field in the current input record
NR 当前处理的行号,The total number of input record seen so far
FS 当前的输入分隔符,默认是空白字符(空格和tab),field separate,如:FS=":",表示输入内容是以:分隔开的
OFS

当前的输出分隔符,默认是空格字符(空格),output field separate

如:OFS="#"表示输出的内容以#分割开。

$NF:最后一个字段

$(NF-1):倒数第2个字段

扩展:cat -n 、nl:以行号的形式输出。

[root@localhost lianxi]# cat -n     /etc/passwd|head
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
.........
[root@localhost lianxi]# nl   /etc/passwd|head
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     ........................

w:查看连接到你的机器上的有哪些机器。

查看连接到你机器的机器,并且截取出第一个字段。

[root@localhost lianxi]# w|awk '{print $1,$NF}'
14:58:29 0.05
USER WHAT
root -bash
root w

四、awk命令的完整语法

1、格式

awk 'BEGINK{commands}pattern{commands}END{commands}'  file1

练习:①、截取出/etc/passwd中第三个字段大于500,并且小于1000的那部分内容。

[root@localhost lianxi]# awk -F ":" 'BEGIN{print "####start####"} $3>500&&$3<1000{print $1,$3}END{print "####end####"}'   /etc/passwd|head
####start####
polkitd 999
chrony 998
zabbix 997
nginx 996
grafana 995
####end####

②、查找/etc/passwd文件中包含feng的内容或者字段3大于1005的,并打印出每行的字段数、行号、第一个字段和第一个字段的长度、倒数第二个字段、第三个字段。

[root@localhost lianxi]# cat /etc/passwd|awk -F: 'BEGIN{num=0;print"开始统计/etc/passwd文件"}$1 ~/feng/ || $3 > 1005 {print NR,NF,$1,length($1),$(NF-1),$NF,$3,num++}END{print "统计结束",num}'

③、截取以feng开头的2次以上,并且第三个字段大于2000的,或者最后一个字段是含有bash的,然后打印出行号、每行的字段数,字段1、字段3以及字段1的长度、倒数第二个字段,最后一个字段。

[root@localhost shell]# awk  -F: 'BEGIN{num=0;print "start"} $1 ~ /^feng{2,}/ && $3 >2000 || $NF ~ /bash/ {print NR,NF,$1,$3,length($1),$(NF-1),$NF;num++} END{print "行数:"num}'  /etc/passwd
1 7 root 0 4 /root /bin/bash
20 7 angel 1000 5 /home/angel /bin/bash
21 7 aj 1001 2 /home/aj /bin/bash
22 7 qiantao 1002 7 /home/qiantao /bin/bash
23 7 yalin 1003 5 /home/yalin /bin/bash
24 7 jj 1004 2 /home/jj /bin/bash
25 7 aojiao 1005 6 /home/aojiao /bin/bash
30 7 sc 1006 2 /home/sc /bin/bash
31 7 sl1 1007 3 /home/sl1 /bin/bash
...........
行数:57

④、who的用法:

who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。

[root@localhost lianxi]# who|awk '{print "username:"$1" time:"$3}'
username:root time:2022-07-07
username:root time:2022-07-07
username:root time:2022-07-07
[root@localhost lianxi]# who|awk '{print "username:"$1", uid:"$3}'
username:root, uid:2022-07-07
username:root, uid:2022-07-07
username:root, uid:2022-07-07
[root@localhost lianxi]# who|awk '{print "username:"$1", uid:"$3}' /etc/passwd|head -5
username:root:x:0:0:root:/root:/bin/bash, uid:
username:bin:x:1:1:bin:/bin:/sbin/nologin, uid:
username:daemon:x:2:2:daemon:/sbin:/sbin/nologin, uid:
username:adm:x:3:4:adm:/var/adm:/sbin/nologin, uid:
username:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin, uid:
[root@localhost lianxi]# awk -F: '/bash/{print "username:"$1", uid:"$3}' /etc/passwd|head -5
username:root, uid:0
username:angel, uid:1000
username:aj, uid:1001
username:qiantao, uid:1002
username:yalin, uid:1003
[root@localhost shell]# awk -F: '{print "username:"$1", uid:"$3}' /etc/passwd|head -5
username:root, uid:0
username:bin, uid:1
username:daemon, uid:2
username:adm, uid:3
username:lp, uid:4

⑤、截取出每个人所对应的语文和Linux成绩。

[root@localhost shell]# cat grade.txt
id    name     chinese    math   english//linux
1     cali      80        80     80//88
2     rose      90        70     90//78
3     tom       70        100    85//22
4     jenny     100       60     90//95
root@localhost shell]# awk -F"[ /]+" '{print $2,$3,$6}' grade.txt 
name chinese linux
cali 80 88
rose 90 78
tom 70 22
jenny 100 95

2、 awk 中 gsub和tr命令的使用

1、gsub:替换

格式:gsub(r,s [, t]): For each substring matching the regular expression r in the string t,substitute,substitue the string s,and return the number of substituions。

练习:将$5对应的字符串里查找“/”字符串,并将其替换成" "空格。

[root@localhost shell]# awk '{gsub("/"," ",$5); print $2,$3,$5}' grade.txt
name chinese englishlinux
cali 80 8088
rose 90 9078
tom 70 8522
jenny 100 9095

2、 tr命令:字符转换和删除

① tr:translate or delete characters  将字符进行转换和删除。

练习:tr '/' "\t":进行替换,将“/”替换成"\t";"\t";table键

root@localhost shell]# cat grade.txt|tr '/' "\t"
id    name     chinese    math   english    linux
1     cali      80        80     80   88
2     rose      90        70     90   78
[root@localhost shell]# cat grade.txt|tr '//' "\t"
id    name     chinese    math   english    linux
1     cali      80        80     80   88
2     rose      90        70     90   78
.........

将a替换为8,将b替换为9。

[root@localhost shell]# echo aaaaaabbbbcccc123 |tr ab 89
8888889999cccc123
[root@localhost shell]# echo aaaaaabbbbccccbbbcc123 |tr ab 89
8888889999cccc999cc123

②tr -s:替换并去重。

-s  :suqeeze -repreats:压缩连续的相同(重复)的字符串为一个字符串。

#将“/”替换为空格并压缩
[root@localhost shell]# cat grade.txt|tr -s  "/" " "  
id name chinese math english linux
1 cali 80 80 80 88
2 rose 90 70 90 78
3 tom 70 100 85 22
4 jenny 100 60 90 95
[root@localhost shell]# cat grade.txt |tr -s "/" " "|awk '{print $2,$3,$NF}'
name chinese linux
cali 80 88
rose 90 78
.........

③ tr  -d:删除字符串 delete,delete character in SET1 ,do not translate

格式: tr [OPTION.....SET1 [SET2]

SET1和SET2字符串一一对应替换

练习:①删除”%“的那一列。

[root@localhost shell]# df|tr -d "%"      #删除”%“的那一列
文件系统                   1K-块    已用     可用 已用 挂载点
/dev/mapper/centos-root 17811456 7714488 10096968   44 /
devtmpfs                  485780       0   485780    0 /dev
tmpfs                     497948       0   497948    0 /dev/shm

文本三剑客——awk 截取+过滤+统计(2)+https://developer.aliyun.com/article/1557888

相关文章
|
4月前
|
存储 网络协议 Shell
文本三剑客——awk 截取+过滤+统计(2)
文本三剑客——awk 截取+过滤+统计
|
4月前
|
Shell 网络安全 开发工具
文本三剑客——grep过滤
文本三剑客——grep过滤
|
6月前
|
安全
如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行、关键字断行等等内容格式整理
该工具用于文本格式处理,能调整每行字数、进行内容断行、提取特定格式内容等。在示例中,展示了如何将一段“交通安全教育”文字按30字每行分隔,并整理出带序号的格式。工具支持序号断行和多级序号设置,适用于笔记整理、文档格式化和内容布局优化,能提升工作效率。下载工具可从百度网盘(提取码:qwu2)或蓝奏云(提取码:2r1z)获取。
|
6月前
|
弹性计算 运维 Shell
使用cut提取子串
【4月更文挑战第29天】
40 2
|
6月前
|
Linux Perl
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
160 0
|
Shell
Shell 过滤数据(cut 截取过滤列)
Shell 过滤数据(cut 截取过滤列)
92 0
R7-2 统计字符[2]
R7-2 统计字符[2]
100 0
7-4 统计一行文本的单词个数
7-4 统计一行文本的单词个数
108 0
|
索引 Perl
AWK进行简单分析文本
AWK进行简单分析文本
84 0