awk基础用法详解

这篇具有很好参考价值的文章主要介绍了awk基础用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

awk用法

一、基本用法

  • 处理格式
$ awk 动作 文件名
$ awk '{print $0}' demo.text

说明:demo.txt是awk要处理的文本文件。单引号内部有大括号,里面就是每行要处理的动作print $0, 其中print是打印命令,$0代表当前样,执行结果为将文件原样输出。

$ echo 'this is my name'|awk '{print $0}'
this is a my name

说明:上面的代码就是将this is my name, 重新打印一遍。

  • 字段分割
    awk默认使用空格和制表符,将每一行数据分成若干字段,字段依次使用$1、$2、$3 …依次代表第一个字段、第二个字段、第三个字段,其中需要$0入上文所描述,代表整行数据。
$ echo 'this is my name' | awk '{print $2}'
$ is

说明:上述代码作用是使用空格分割this is my name, 打印第2个域字段。

  • F参数

默认情况下awk使用tab和空格对数据进行分段,当需要指定自定义分割符时,可以使用-F参数进行指定。

$ echo 'root:x:0:0:root:/usr/bin/zsh' | awk -F':' '{print $3}'
$ 0

说明:上述代码使用:对数据进行分割,并打印第三个字段,(-F:或-F’:'或-F ':'都是正确的写法)。
注:使用;作为分割符时,因;为shell脚本的结束符,故使用;时需要进行转义(-F;或者-F ‘;’)。

二、变量

  • awk内置变量列表
符号 作用
NF 表示当前行有多少字段,因此使用$NF表示最后一段
NR 表示当前处理是多少行
FS 字段分割符,默认是空格和制表符
OFS 输出字段的分割符
ORS 输出记录的分割符,用于打印是分割记录,默认为换行符
OFMT 数字输出格式
  • NF实例
$ echo '/home/tome/src/sec' | awk -F/ '{print $2}'
home

说明:上述实例中使用/对/home/tome/src/sec进行分割,$1为空$2为home

  • NR 实例

使用/etc/passed文件进行实例说明

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

说明:以上文/etc/passwd文件中的内容

$ awk -F: '{print NR,$2}'  /etc/passwd
1 /bin/bash
2 /usr/sbin/nologin
3 /usr/sbin/nologin
4 /usr/sbin/nologin
5 /bin/sync
6 /usr/sbin/nologin
7 /usr/sbin/nologin

说明:输出结果中,第一列为NR的值表示处理的当前的行数、第二列为使用:分割文件行后的最后一个字段域的内容。

  • FS 实例
  1. 通过FS可以实现修改分割字段的字符
$ awk '{print $1,$2,$3}' FS=':' /etc/passwd
root x 0
daemon x 1
bin x 2
sys x 3
sync x 4
games x 5
man x 6
lp x 7

说明:通过FS变量指定分割符为:并打印第一、第二、第三列数据(FS=':'或FS=:相同)

  1. 通过FS指定多个分割符

为了方便对比我们先指定一个分割符效果如下

$ awk '{print $1,$2,$NF}' FS=[:] /etc/passwd
root x /bin/bash
daemon x /usr/sbin/nologin
bin x /usr/sbin/nologin
sys x /usr/sbin/nologin
sync x /bin/sync
games x /usr/sbin/nologin
man x /usr/sbin/nologins

同时指定两个分割字符的效果如下

$ awk '{print $1,$2,$NF}' FS=[:/] /etc/passwd
root x bash
daemon x nologin
bin x nologin
sys x nologin
sync x sync
games x nologin
man x nologin
  • OFS 实例
awk '{print $1,$2,$NF}' FS=[:/] OFS='|' /etc/passwd
root|x|bash
daemon|x|nologin
bin|x|nologin
sys|x|nologin
sync|x|sync
games|x|nologin
man|x|nologin

说明:上述实例指定输入分割符为:/,指定输出分割符为|,输出第一列、第二列、最后一列时,使用|分割输出的结果。

三、awk内置函数

  • 常用原函数
函数名称 作用
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
tolower() 字符转为小写
toupper() 字符转为小写
length() 返回字符串长度
index(s,t) 返回s中字符串t的第一位置
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 将字符串s使用fs分割并存储在数组a中
sprint(fmt,exp) 返回经fmt格式化后的exp
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
  • gsub(r,s)及- gsub(r,s,t) 在整个$0中用s替代r用法示例
$ cat passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
  1. 将上述文件中用:分割个第一列中的root替换为boot
$ cat passwd.txt  | awk -F: '{gsub("root","boot", $1); print $0}'
boot x 0 0 root /root /bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
  1. 将上述文件中的root替换为boot
$ cat passwd.txt  | awk -F: '{gsub("root","boot", $0); print $0}'
boot:x:0:0:boot:/boot:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ cat passwd.txt  | awk -F: '{gsub("root","boot"); print $0}'
boot:x:0:0:boot:/boot:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
  • tolower() 字符转为小写示例
$ cat passwdUpper.txt
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
DAEMON:X:1:1:DAEMON:/USR/SBIN:/USR/SBIN/NOLOGIN
BIN:X:2:2:BIN:/BIN:/USR/SBIN/NOLOGIN
SYS:X:3:3:SYS:/DEV:/USR/SBIN/NOLOGIN
SYNC:X:4:65534:SYNC:/BIN:/BIN/SYNC
$ cat passwdUpper.txt  | awk -F: '{ print tolower($0)}'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
  • toupper() 字符转为小写示例
$ cat passwd.txt  | awk -F: '{print toupper($0)}'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
DAEMON:X:1:1:DAEMON:/USR/SBIN:/USR/SBIN/NOLOGIN
BIN:X:2:2:BIN:/BIN:/USR/SBIN/NOLOGIN
SYS:X:3:3:SYS:/DEV:/USR/SBIN/NOLOGIN
SYNC:X:4:65534:SYNC:/BIN:/BIN/SYNC
  • length() 返回字符串长度示例
$ cat passwd.txt | awk -F: '{ print length($1)}'
4
6
3
3
4
  • index(s,t) 返回s中字符串t的第一位置示例
cat passwd.txt | awk -F: '{ print $0;print index("root",$1)}'
root:x:0:0:root:/root:/bin/bash
1
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
0
bin:x:2:2:bin:/bin:/usr/sbin/nologin
0
sys:x:3:3:sys:/dev:/usr/sbin/nologin
0
sync:x:4:65534:sync:/bin:/bin/sync
0
  • match(s,r) 测试s是否包含匹配r的字符串示例
$ cat passwd.txt | awk -F: '{ print $0;print match($0,"root")}'
root:x:0:0:root:/root:/bin/bash
1
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
0
bin:x:2:2:bin:/bin:/usr/sbin/nologin
0
sys:x:3:3:sys:/dev:/usr/sbin/nologin
0
sync:x:4:65534:sync:/bin:/bin/sync
0
  • split(s,a,fs) 将字符串s使用fs分割并存储在数组a中示例
    split (s,a) 如果第三个参数没有提供,awk就默认使用当前FS值
$ cat passwd.txt | awk  '{print $0;split($0,arry,":");print length(arry),arry[1],arry[2],arry[3]}'
root:x:0:0:root:/root:/bin/bash
7 root x 0
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
7 daemon x 1
bin:x:2:2:bin:/bin:/usr/sbin/nologin
7 bin x 2
sys:x:3:3:sys:/dev:/usr/sbin/nologin
7 sys x 3
sync:x:4:65534:sync:/bin:/bin/sync
7 sync x 4

  • sprint(fmt,exp) 返回经fmt格式化后的exp示例
  1. fmt格式化说明:
格式 说明 示例 输出结果
%c 将ASCII转化为字符输出 echo|awk ‘{print sprintf(“%c”,66)}’ B
%d,%i 转化为整数不会进行四舍五入 echo|awk ‘{print sprintf(“%d”,2.22)}’ 2
%e,%E 科学计数法输出 echo|awk ‘{print sprintf(“%e”,2.22)}’ 2.220000e+00
%f,%F 浮点数输出,会四舍五入 echo|awk ‘{print sprintf(“%f”,2.22)}’ 2.220000
%g,%G 输出浮点数,或者科学计数法输出 echo|awk ‘{print sprintf(“%g”,2.22)}’ 2.22
%o 输出八进制 echo|awk ‘{print sprintf(“%o”,12)}’ 14
%s 输出字符串 echo|awk ‘{print sprintf(“%s”,121111)}’ 121111
%x,%X 输出十六进制 echo|awk ‘{print sprintf(“%x”,18)}’ 12
%% 输出%号 echo|awk ‘{print sprintf(“%%%x”,18)}’ %12
  1. 修饰符—在格式化字符的前面
修饰符 说明 示例 结果
N$ N是正整数。printf的字段列表顺序和格式化字符串中的%号顺序是一一对应的,使用N$可以自行指定顺序 echo|awk -F: ‘{print sprintf(“%2$s,%1$s”, “hello”,“word”)}’ word,hello
%5s 宽度 指定该字段占用的字符数量,不足宽度默认使用空格填充,超出宽度将无视 echo|awk -F: ‘{print sprintf(“%10s”, “hello”)}’ _____hello(下划线表示空格)
- 表示左对齐。默认是右对齐的 echo|awk -F: ‘{print sprintf(“%-10s”, “hello”)}’ hello_____(下划线表示空格)
%.Nf N是正整数。浮点数保留小数位数 echo|awk ‘{print sprintf(“%.3f”,18.12345)}’ 18.123
  1. 简单的示例:
cat passwd.txt | awk  -F: '{a = sprintf("%s-%s",$1,$2);print a}'
root-x
daemon-x
bin-x
sys-x
sync-x
  • substr(s,p) 返回字符串s中从p开始的后缀部分示例
$ cat passwd.txt | awk '{print $1 ;print "----"substr($1,4)}'
root:x:0:0:root:/root:/bin/bash
----t:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
----mon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
----:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
----:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
----c:x:4:65534:sync:/bin:/bin/sync
  • substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分示例
$ cat passwd.txt | awk '{print $1 ;print "----"substr($1,4,10)}'
root:x:0:0:root:/root:/bin/bash
----t:x:0:0:ro
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
----mon:x:1:1:
bin:x:2:2:bin:/bin:/usr/sbin/nologin
----:x:2:2:bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
----:x:3:3:sys
sync:x:4:65534:sync:/bin:/bin/sync
----c:x:4:6553

四、条件语句

wk允许指定输出条件,只输出符合条件的行

$ awk ‘条件 动作’ 文件名文章来源地址https://www.toymoban.com/news/detail-759880.html

  • 正则表达式匹配指定的行
$ cat passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ cat passwd.txt | awk '/sys/ {print $1}'
sys:x:3:3:sys:/dev:/usr/sbin/nologin
  • 输出偶数行
$ cat passwd.txt | awk -F: 'NR % 2 == 0 {print $1}'
daemon
sys
  • 输出字段等于特定值
$ cat passwd.txt | awk -F: '$1 == "bin" {print $0}'
bin:x:2:2:bin:/bin:/usr/sbin/nologin
  • if语句
$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0}'
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0 ;else print $1}'
root:x:0:0:root:/root:/bin/bash
daemon
bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0 ;else if($1<"r") print $1}'
root:x:0:0:root:/root:/bin/bash
daemon
bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

到了这里,关于awk基础用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux - 进阶 NFS服务器 详解网络共享服务器 ( 预备知识)

               N  :  就是 网络 Network          F   :     就是  File  文件         S   :  system          简称为 网络文件系统                 官方   :               NFS 是一种古老的用于UNIX/LINUX主机之间进行文件共享的协议              Network  File  System 网

    2024年02月13日
    浏览(50)
  • 【Linux】NTP时间服务器Chrony配置详解

    🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天

    2024年02月08日
    浏览(38)
  • Linux服务器集群-大数据基础环境搭建指南

    本文将构建三台Linux服务器(node1、node2、node3),通过相关配置,搭建出一个Linux服务器集群环境适用于大数据的开发学习。 本文使用的VMware版本为:VMware16; 本文环境搭建使用到的Linux发行版本为:CentOS7; 本文的电脑操作环境为:windows11。 首先,需要根据之前发文中的流程

    2024年02月07日
    浏览(56)
  • Linux服务器配置指南:网络、用户管理、共享服务及DNS配置详解

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 设置虚拟机的网卡为仅主机模式,并要求服务器采用双网卡, ens33 IP地址设置为192.168. 5.x/24(其中x学号),

    2024年02月05日
    浏览(54)
  • linux 服务器执行post请求 curl命令详解

    curl是一个命令行访问URL的计算机逻辑语言的工具,发出网络请求,然后得到数据并提取出,显示在标准输出“stdout”上面,可以用它来构造http request报文,curl(CommandLine Uniform Resource Locator),即在命令行中利用URL进行数据或者文件传输。 基本语法: curl [option] [url] 实际用法 PO

    2024年02月02日
    浏览(42)
  • 基于ansible初始化linux服务器基础环境。

    大家好,今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境,但很多时候都会出现一些问题。不过现在有了一种新的方法,就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7,但只要稍作修改就可以应用到其他的

    2023年04月27日
    浏览(45)
  • 【Linux后端服务器开发】基础IO与文件系统

    目录 一、基础IO 1. C语言文件读写 2. 标志位传参 3. C语言与系统调用关系 二、文件系统 1. 文件描述符 2. 输入输出重定向 文件调用 库函数接口: fopen、fclose、fwrite、fread、fseek 系统调用接口:open、close、write、read、lseek r/w/a :读/写/追加 若打开的文件不存在,“r”报错,“

    2024年02月15日
    浏览(64)
  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(85)
  • Linux下服务器基本环境搭建步骤详解(三种软件安装方式)

    小伙伴们注意看:下面使用三种方式分别安装JDK、Tomcat、Docker进行演示 操作系统基于CentOs7. Linux服务器的学习小结,希望能给到小伙伴们一点帮助。同时也方便我自己回顾。觉得可以记得好评点赞,阿里嘎多! 1、rpm下载地址 方式一 :rpm 下载地址 方式二 :https://www.aliyundr

    2024年02月11日
    浏览(45)
  • linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解

    1.1 使用查看端口号对应的进程信息 方式一 : 使用netstat命令 -t:显示TCP连接 -u:显示UDP连接 -l:仅显示监听状态的连接 -n:以数字形式显示端口号,而不是以服务名称显示 通过管道符号|将netstat的输出结果传递给grep命令,用于过滤出包含指定端口号的行。 执行命令后,终端

    2024年02月04日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包