当前位置:网站首页>awk语法-01-基础语法(命令、选项、内部变量)
awk语法-01-基础语法(命令、选项、内部变量)
2022-08-02 06:03:00 【开发运维玄德公】
文章目录
1. 语法
awk [选项] '命令' 文件名
下边我们分别对 选项、命令和内置变量详细说明。
2. 命令
2.1 {} 每行操作
- 语法示例
awk '{每行处理}' 文件名
- 示例
[[email protected] ~]# awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
2.2 BEGIN{} 读入前操作
- 语法示例
awk 'BEGIN{开始时处理};{每行处理}' 文件名
- 完整示例
用BEGIN打印一个简单“表头”
[[email protected] ~]# awk -F : 'BEGIN{printf "|%-20s|%-20s\n======================================\n","Name","Id"};{printf "|%-20s|%-20s\n",$1,$3}' /etc/passwd
|Name |Id
======================================
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
|sync |5
|shutdown |6
|halt |7
|mail |8
|operator |11
|games |12
|ftp |14
|nobody |99
|systemd-network |192
|dbus |81
|polkitd |999
|sshd |74
|postfix |89
|chrony |998
|cloud_user |1000
2.3 END{} 读入后操作
- 语法示例
awk 'END{结尾时处理};{每行处理}' 文件名
- 完整示例
给表格加一个结尾
[[email protected] ~]# awk -F : 'BEGIN{printf "|%-20s|%-20s\n=======================================\n","Name","Id"};{printf "|%-20s|%-20s\n",$1,$3};END{printf "======================================\n%30s \n","MAINTAINER: liuBei"}' /etc/passwd
|Name |Id
=======================================
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
|sync |5
|shutdown |6
|halt |7
|mail |8
|operator |11
|games |12
|ftp |14
|nobody |99
|systemd-network |192
|dbus |81
|polkitd |999
|sshd |74
|postfix |89
|chrony |998
|cloud_user |1000
======================================
MAINTAINER: liuBei
3. 选项
3.1 -F 分隔符
- 语法
awk -F 分隔符
- 完整示例
[[email protected] ~]# awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
3.2 -f 指定awk脚本
语法
- 方法一
awk -f 脚本文件名 文件名
- 方法二
./脚本文件名 文件名
完整示例(awk -f)
- 创建脚本文件
myAwk.awk
#!/bin/awk -f
BEGIN{
line="============================================";
printf "|%-20s|%-20s\n%s\n","Name","Id",line
}
{
printf "|%-20s|%-20s\n",$1,$3
}
END{
line="============================================";
printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}
说明:在脚本中,变量只能写在每个模块中。如果要统一写,我们会在后文 -v 选项中使用。
- 执行和结果
[[email protected] ~]# awk -F : -f myAwk.awk /etc/passwd
|Name |Id
============================================
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
|sync |5
|shutdown |6
|halt |7
|mail |8
|operator |11
|games |12
|ftp |14
|nobody |99
|systemd-network |192
|dbus |81
|polkitd |999
|sshd |74
|postfix |89
|chrony |998
|cloud_user |1000
============================================
MAINTAINER: liuBei
完整示例(直接执行脚本)
如果脚本文件的内容足够,我们可以不使用
awk -f,而直接执行脚本
- 创建脚本文件
myAwk.awk,并给执行权限。
#!/bin/awk -f
BEGIN{
FS=":";
line="============================================";
printf "|%-20s|%-20s\n%s\n","Name","Id",line
}
{
printf "|%-20s|%-20s\n",$1,$3
}
END{
line="============================================";
printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}
说明:在脚本中,变量只能写在每个模块中。如果要统一写,我们会在后文 -v 选项中使用。
- 执行和结果
[[email protected] ~]#./myAwk.awk /etc/passwd
|Name |Id
============================================
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
|sync |5
|shutdown |6
|halt |7
|mail |8
|operator |11
|games |12
|ftp |14
|nobody |99
|systemd-network |192
|dbus |81
|polkitd |999
|sshd |74
|postfix |89
|chrony |998
|cloud_user |1000
============================================
MAINTAINER: liuBei
3.3 -v 变量使用
语法示例
awk -v key=value ……
完整示例
- wak脚本
我们在命令行传入变量,因此脚本中不用在写变量了。
#!/bin/awk -f
BEGIN{
printf "|%-20s|%-20s\n%s\n","Name","Id",line
}
{
printf "|%-20s|%-20s\n",$1,$3
}
END{
printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}
- 执行和结果
[[email protected] ~]# awk -F : -v line="============================================" -f myAwk.awk /etc/passwd
|Name |Id
============================================
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
|sync |5
|shutdown |6
|halt |7
|mail |8
|operator |11
|games |12
|ftp |14
|nobody |99
|systemd-network |192
|dbus |81
|polkitd |999
|sshd |74
|postfix |89
|chrony |998
|cloud_user |1000
============================================
MAINTAINER: liuBei
4. 内部变量
下边换了一台服务器,示例输出会和之前有出入。
4.1 显示行、列数
| 变量 | 作用 | 备注 |
|---|---|---|
| NR | 显示记录号 | 即,改记录是处理的第几行 |
| FNR | 按文件显示记录号 | 即,该行是所在文件的第几行 |
| NF | 显示该列的字段数 | —— |
NR 记录处理的行号
[[email protected] ~]# awk -F : '$1 ~ /root/{print NR,$0}' /etc/passwd /etc/shadow
1 root:x:0:0:root:/root:/bin/bash
30 root:$6$2fcntdFm$WWOEzr7r4BrkBOBz1k7Z.e04RVFU3PauaKr4ujKZ8xH/H2u/IF5NVesfHcexhsKzPi5nkXvgzgXDL75aCShjw0:18410:0:99999:7:::
root:$6$cIJxcczwzSZKnXO/$6lbW4FMYSqfjaMJzoLPTpYkXYXA/u/XN.edzv6O8eMHe.cwa19oyzXG5rOjR0ojoxPTBgfq1tSqJhFqEiRrVG.:19188:0:99999:7:::
说明:该命令我们处理了
passwd和shadow两个文件,结果可见:
passwd中的root信息是该文件中第1行,也是本次处理的第1行。shadow中的root信息是该文件的第1行,但它是命令中第21行处理的。
FNR 记录文件中的行号
[[email protected] ~]# awk -F : '$1 ~ /root/{print FNR,$0}' /etc/passwd /etc/shadow
1 root:x:0:0:root:/root:/bin/bash
1 root:$6$2fcntdFm$WWOEzr7r4BrkBOBz1k7Z.e04RVFU3PauaKr4ujKZ8xH/H2u/IF5NVesfHcexhsKzPi5nkXvgzgXDL75aCShjw0:18410:0:99999:7:::
上文我们可知,虽然
shadow的root是第30行处理的,但是FNR记录的是它在文件中的位置,因此FNR值是1
NF 记录该行的字段数
[[email protected] ~]# awk -F : '{print $0,NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash 7
bin:x:1:1:bin:/bin:/sbin/nologin 7
daemon:x:2:2:daemon:/sbin:/sbin/nologin 7
adm:x:3:4:adm:/var/adm:/sbin/nologin 7
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7
sync:x:5:0:sync:/sbin:/bin/sync 7
如上可见,passwd文件每行都是7个字段
4.2 格式化输出
| 变量 | 作用 | 备注 |
|---|---|---|
| FS | 输入字段分隔符(相当于-F) | |
| OFS | 输出字段分隔符 | 注意是输出时的分隔符,不会改变原有分隔符 |
| RS | 输入记录换行符 | |
| ORS | 输出记录换行符 |
FS 输入字段分隔符
[[email protected] ~]# awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
OFS输出字段分隔符
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="-"} {print $1,$3}' /etc/passwd
root-0
bin-1
daemon-2
adm-3
lp-4
sync-5
如上可见,输出的字段分隔符是
-。
注意:此处是输出时的分隔符,不会改变原有分隔符
如下例,虽然输出分隔符改变了,但打印
$0时显示的原有分隔符仍然是:
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="-"} {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
RS 输入记录换行符
[[email protected] ~]# awk 'BEGIN{RS=":"} {print $0}' /etc/passwd
root
x
0
0
root
/root
/bin/bash
bin
x
1
1
bin
/bin
/sbin/nologin
daemon
x
2
2
daemon
/sbin
/sbin/nologin
adm
如上可见,
:被当成了换行符,因此一行只有一个字段。
ORS 输出记录换行符
[[email protected] ~]# awk 'BEGIN{ORS="\n--------------------------------------\n"} {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
--------------------------------------
bin:x:1:1:bin:/bin:/sbin/nologin
--------------------------------------
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--------------------------------------
adm:x:3:4:adm:/var/adm:/sbin/nologin
--------------------------------------
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
--------------------------------------
sync:x:5:0:sync:/sbin:/bin/sync
--------------------------------------
如上可见,输出的换行符是 两个换行符中间夹一横线。

边栏推荐
猜你喜欢
随机推荐
[Cartoon] 2021 full score programmer behavior comparison table (latest version)
Two good php debug tutorials
Leetcode周赛304
odoo field 设置匿名函数domain
MySQL 5.7 安装教程(全步骤、保姆级教程)
postgres 多个变量填充字符串,字串格式化
View source and switch mirrors in two ways: npm and nrm
The stock price has repeatedly hit new lows, and the real estate SaaS giant is in trouble. How should Mingyuan Cloud transform and save itself?
request.getSession(),的故事
MySQL high-level statements (1)
MySql 5.7.38下载安装教程 ,并实现在Navicat操作MySql
MySQL (3)
PHP Warning: putenv() has been disabled for security reasons in phar
punch day05
MySQL database video tutorial from beginner to proficient
Nodejs安装教程
APP special test: traffic test
Difference between npm and yarn
At age 94, pioneer Turing award winner, computational complexity theory, Juris Hartmanis, died
typescript ‘props‘ is declared but its value is never read 解决办法
![[数据集][VOC]眼睛佩戴数据集VOC格式6000张](/img/66/37f76d9ce5d5f68d6ea0e18710fa04.png)
![[数据集][VOC]男女数据集voc格式6188张](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)







