awk的使用方法点滴

示例文本(取自CentOS7.0系统):

# cat -n awk1.txt

 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
 5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 6  sync:x:5:0:sync:/sbin:/bin/sync
 7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 8  halt:x:7:0:halt:/sbin:/sbin/halt
 9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10  operator:x:11:0:operator:/root:/sbin/nologin
11  games:x:12:100:games:/usr/games:/sbin/nologin
12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13  nobody:x:99:99:Nobody:/:/sbin/nologin
14  dbus:x:81:81:System message bus:/:/sbin/nologin
15  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
16  abrt:x:173:173::/etc/abrt:/sbin/nologin
17  unbound:x:998:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin
18  colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
19  usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
20  ntp:x:38:38::/etc/ntp:/sbin/nologin
21  avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
22  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
23  saslauth:x:996:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
24  qemu:x:107:107:qemu user:/:/sbin/nologin
25  libstoragemgmt:x:995:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
26  rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
27  rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
28  nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
29  rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
30  radvd:x:75:75:radvd user:/:/sbin/nologin
31  chrony:x:994:993::/var/lib/chrony:/sbin/nologin
32  pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
33  gdm:x:42:42::/var/lib/gdm:/sbin/nologin
34  gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
35  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
36  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
37  tcpdump:x:72:72::/:/sbin/nologin
38  yfc001:x:1000:1000:yfc001:/home/yfc001:/bin/bash
39  systemd-bus-proxy:x:992:989:systemd Bus Proxy:/:/sbin/nologin
40  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
41  dockerroot:x:991:988:Docker User:/var/lib/docker:/sbin/nologin
42  mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
43  apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
44  named:x:25:25:Named:/var/named:/sbin/nologin


1、awk -F ":" '( $1 == "root" ) {print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

-F参数后跟指定的分隔符,默认为空格(单个或连续的多个)、制表符等,分隔符将一行文本分成几个域

/etc/passwd为awk要处理的文件

{print $0}指定输出信息,$0表示输出所有域,$1表示第一个域,$2表示第二个域,以此类推

($1 == "root")按域指定条件,$1表示第一个域,第一个域的值为字符串"root"时,执行后面指定输出信息的语句

2、awk -F ":" '( $1 == "root" ) || /sshd/ {print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

||条件或,满足左侧或右侧条件的时候,执行后面指定的输出

/sshd/按匹配字符串指定条件,斜杠之间的字符串为匹配字符串,一行文本中包含指定的字符串时,执行后面指定输出信息的语句

3、awk -F ":" '( $1 == "root"  ) || /sshd/ {if($7~/^\/sbin\/nologin$/)print $0}' /etc/passwd

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

if($7~/^\/sbin\/nologin$/)指定判断条件,承接前面的条件,由该if语句进行进一步的筛选,

$7表示第七个域,~后面引出该域要满足的条件,"\"为转义符,取消后面紧跟字符的特殊意义,使其只代表字符本身的意义,

^表示字符串的开头,$表示字符串的结尾,两个斜杠之间为匹配内容

### Linux 中 `awk` 命令的使用方法 #### 什么是 `awk` `awk` 是一种强大的文本处理工具,主要用于模式扫描和文本处理。它可以识别并处理文件中的每一行数据,并按照指定条件执行操作[^1]。 #### `awk` 的基本语法结构 `awk` 的基本格式可以表示为: ```bash awk [选项] '脚本' 输入文件 ``` 其中 `[选项]` 可选,而 `'脚本'` 部分通常是一个简单的程序逻辑,用于定义如何处理输入的数据[^2]。 #### 示例:简单计算 下面展示了一个简单的例子,说明如何通过 `awk` 执行一些基础运算: ```bash awk 'BEGIN { x = 10; print x + 1 }' ``` 此命令会在不读取任何外部文件的情况下打印出 `11`。这里需要注意的是,在单引号内部的内容会被直接解释为字符串形式传递给 `awk` 处理器,因此即使没有 `$` 符号也能正常工作[^3]。 #### 文件内容筛选与字段提取 假设有一个名为 `data.txt` 的文件,其内容如下: ``` John Doe,30,San Francisco Jane Smith,25,Los Angeles Bob Johnson,40,New York ``` 要获取每个人的年龄列(即第二列),可运行以下命令: ```bash awk -F ',' '{print $2}' data.txt ``` 上述指令设置了逗号作为分隔符 (`-F ','`) 并输出每行记录中的第二个字段[$2]。 #### 条件过滤 继续以上述 `data.txt` 数据为例,如果我们只想显示那些来自洛杉矶的人的信息,则可以用这样的语句实现: ```bash awk -F ',' '$3 == "Los Angeles" {print $0}' data.txt ``` 这里的 `$3 == "Los Angeles"` 表达式指定了仅当第三列为 `"Los Angeles"` 时才执行后面的 `{print $0}` 动作。 #### 结合多个动作 还可以在一个 `awk` 调用里完成多项任务。比如统计总人数以及平均年龄: ```bash awk -F ',' 'NR==1{sum=0}{sum += $2}END{print "Total:", NR, ", Average Age:", sum/NR}' data.txt ``` 这段代码先初始化求和变量 `sum` ,接着累加所有人的年龄到该变量上;最后在结束阶段(`END`)报告总数目及均值。 #### 内建变量简介 以下是几个常用的内置变量及其功能概述: - **NF**: 当前行拥有的域数(字段数量) - **NR**: 已经被读入的记录数目 (当前行为第几条) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值