一、AWK
1.1 原理和常用选项
awk
是一种强大的文本处理工具,它提供了一种编程语言来处理文本文件中的数据。awk
能够对输入的文本数据进行模式匹配和处理,执行复杂的文本操作。
工作原理:
- 输入处理:
awk
从输入文件中读取数据,通常每行数据由空白字符分隔的字段组成。 - 模式匹配:
awk
可以根据指定的模式对输入行进行匹配。模式可以是正则表达式或条件表达式。 - 动作执行:当输入行与模式匹配时,
awk
执行与该模式相关联的动作,如打印字段、计算总和等。 - 内置变量:
awk
提供了一些内置变量,如NF
(当前行的字段数)、NR
(当前处理的记录数,通常是行号)等,用于控制处理流程。 - 用户定义变量:用户可以创建自己的变量来存储和操作数据。
命令和选项:
-f scriptfile
:从指定的脚本文件中读取awk
程序。-v var=value
:在awk
程序开始之前设置变量的值。-F separator
:设置输入字段的分隔符,默认是空格或制表符。-v FS=separator
:与-F
相同,设置输入字段的分隔符。-v OFS=separator
:设置输出字段的分隔符,默认与输入字段分隔符相同。-v ORS=separator
:设置输出记录的分隔符,默认是换行符。-Fnr
:不自动为输入文件的每一行编号。-Fpat
:设置使用pat
作为字段分隔符。
1.2 练习
练习1:打印/etc/passwd的奇数行
[root@web1 ~]#awk 'NR % 2 == 1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
......
练习2:打印Linux系统的"IP地址,系统版本,CPU核心,内存大小"
[root@web1 ~]#hostname -I
192.168.9.19 172.17.0.1 172.18.0.1
[root@web1 ~]#cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
[root@web1 ~]#lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
Address sizes: 42 bits physical, 48 bits virtual
CPU: 2
在线 CPU 列表: 0,1
每个核的线程数: 2
每个座的核数: 1
......
[root@web1 ~]#free -h
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 1.7Gi 432Mi 114Mi 2.0Mi 1.2Gi 1.1Gi
交换: 0B 0B 0B
#或者使用top命令查看
[root@web1 ~]#cat -n /etc/hosts
1 127.0.0.1 localhost
2
3 # The following lines are desirable for IPv6 capable hosts
4 ::1 localhost ip6-localhost ip6-loopback
5 ff02::1 ip6-allnodes
6 ff02::2 ip6-allrouters
7 127.0.1.1 localhost.vm localhost
8 127.0.1.1 hcss-ecs-89f4 hcss-ecs-89f4
练习3:统计某个文件夹下的文件占用的字符数
[root@web1 ~]#find /etc/ -type f -exec cat {} + | wc -m
2270257
#查找etc下的所有文件,并执行cat命令然后统计字符数