当前位置:网站首页>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
--------------------------------------
如上可见,输出的换行符是 两个换行符中间夹一横线。
边栏推荐
- MySQL高级SQL语句(二)
- PHP Warning: putenv() has been disabled for security reasons in phar
- Connection reset by peer 问题解析
- love
- MySQL高阶---存储引擎、索引、锁
- node安装及环境变量配置
- July 18-July 31, 2022 (Ue4 video tutorials and documentation, 20 hours. Total 1412 hours, 8588 hours left)
- rhce homework
- MySql 5.7.38下载安装教程 ,并实现在Navicat操作MySql
- nacos安装配置和单机部署教程
猜你喜欢
(部分不懂,笔记整理未完成)【图论】差分约束
abaqus如何快速导入其他cae文件的assembly?
有人开源全凭“为爱发电”,有人却用开源“搞到了钱”
typescript ‘props‘ is declared but its value is never read 解决办法
武汉高性能计算大会2022举办,高性能计算生态发展再添新动力
APP special test: traffic test
Ant three sides: MQ message loss, duplication, backlog problem, what are the solutions?
[数据集][VOC]男女数据集voc格式6188张
Detailed explanation of 9 common reasons for MySQL index failure
Tips for programmers to write PPT
随机推荐
nacos源码启动找不到istio包
打卡day05
MySQL高级-MVCC(超详细整理)
Go inside the basic knowledge
Pagoda+FastAdmin 404 Not Found
npm does not recognize the "npm" item as the name of a cmdlet, function, script file, or runnable program.Please check the spelling of the name, and if the path is included, make sure the path is corr
MySql 5.7.38 download and installation tutorial, and realize the operation of MySql in Navicat
Specified URL is not reachable,caused by :‘Read timed out
HCIP BGP Comprehensive Experiment Establishing peers, route reflectors, federation, route announcement and aggregation
Mining game (C language)
In-depth analysis of the initialization of member variables and local variables
HCIP 第二天
MySQL Index Common Interview Questions (2022 Edition)
abaqus如何快速导入其他cae文件的assembly?
Leading the demand and justifying the HR value - the successful launch of the "Human Resource Leading Model HRLM"
Py之mlxtend:mlxtend库的简介、安装、使用方法之详细攻略
ASP.NET Core Web API 幂等性
MySQL 23道经典面试吊打面试官
Xgboost报错 ValueError: Invalid shape: (1650, 2) for label
odoo field 设置匿名函数domain