前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux-awk及内置变量

Linux-awk及内置变量

作者头像
小小工匠
发布于 2021-08-16 02:58:36
发布于 2021-08-16 02:58:36
2.1K00
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

概述

awk(分析&处理) awk是一个数据处理工具,相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个”字段“来处理。

通常运行模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 awk ' 条件类型1{动作1} 条件类型2{动作2}...‘ filename

awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file

awk 内置变量使用

内置变量表

属性

说明

$0

当前记录(作为单个变量)

$1~$n

当前记录的第n个字段,字段间由FS分隔

FS

输入字段分隔符 默认是空格

NF

当前记录中的字段个数,就是有多少列

NR

已经读出的记录数,就是行号,从1开始

RS

输入的记录他隔符默 认为换行符

OFS

输出字段分隔符 默认也是空格

ORS

输出的记录分隔符,默认为换行符

ARGC

命令行参数个数

ARGV

命令行参数数组

FILENAME

当前输入文件的名字

IGNORECASE

如果为真,则进行忽略大小写的匹配

ARGIND

当前被处理文件的ARGV标志符

CONVFMT

数字转换格式 %.6g

ENVIRON

UNIX环境变量

ERRNO

UNIX系统错误消息

FIELDWIDTHS

输入字段宽度的空白分隔字符串

FNR

当前记录数

OFMT

数字的输出格式(默认值是%.6g)

RSTART

被匹配函数匹配的字符串首

RLENGTH

被匹配函数匹配的字符串长度

SUBSEP

数组下标分隔符(默认值是\034)


栗子

以下操作的数据来源为/etc/passwd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...........

root开头的那一行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

/^root/ 为选择表达式, ^root表示以root开头

0 代表整行 1代表第一个区域,依此类推

设置字段分隔符号(FS使用方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash

[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $2,$NF}' /etc/passwd
x /bin/bash

[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $0,$NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash /bin/bash

[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $6,$NF}' /etc/passwd
/root /bin/bash

FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。

NF是字段总数,0代表当前行记录,1-

$NF 最后一列的值。


记录条数(NR,FNR使用方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
3 daemon /sbin/nologin
4 adm /sbin/nologin
5 lp /sbin/nologin
6 sync /bin/sync
7 shutdown /sbin/shutdown
8 halt /sbin/halt
9 mail /sbin/nologin
10 uucp /sbin/nologin
........

设置输出字段分隔符(OFS使用方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
指定分隔符为^^
[root@entel2 ~]#  awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash

默认字段分隔符:
[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash

OFS设置默认字段分隔符


设置输出行记录分隔符(ORS使用方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin^^

ORS默认是换行符,这里修改为:”^^”,所有行之间用”^^”分隔了。


输入参数获取(ARGC ,ARGV使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]#  awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
ARGC=2
0=awk
1=/etc/passwd

[root@entel2 ~]# awk 'BEGIN{FS=":";print "NUM="ARGC;for(k in ARGV){print k"="ARGV[k];}}' /etc/passwd
NUM=2
0=awk
1=/etc/passwd

ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。


获得传入的文件名(FILENAME使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk 'BEGIN{FS=":";print FILENAME}/^root/{print FILENAME}' /etc/passwd

/etc/passwd

可见 第一行并没有打印出 /etc/passwd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量。

获得linux环境变量(ENVIRON使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
.:/oracle/oracle11/product/112/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

输出数据格式设置:(OFMT使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' /etc/passwd   
0.667 123.111

默认的
[root@entel2 ~]# awk 'BEGIN{OFMT="%.6f";print 2/3,123.11111111;}' /etc/passwd   
0.666667 123.111111

OFMT默认输出格式是:%.6g 保留六位小数,这里修改OFMT会修改默认数据输出格式。

按宽度指定分隔符(FIELDWIDTHS使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# echo 20160922231258 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
2016-09-22 23:12:58

FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS=”4 2 2 2 2 2”就表示1宽度是4,2是2,

RSTART RLENGTH使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
11 11 4

[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }'
0 0 -1

RSTART 被匹配正则表达式首位置,RLENGTH 匹配字符长度,没有找到为-1.


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/09/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
简单认识OSI(计算机网络分层)七层模型
        学校上课讲的太笼统啥也不是,自己学的太玄学似懂非懂突然在看到了一篇公众文文章。文章从初始到现在,步步为营的遇到一个解决一个前人的问题,有了细致入微的讲述,把之前学的死东西都连起来了。
比特大冒险
2023/10/17
7620
简单认识OSI(计算机网络分层)七层模型
网络基础:OSI七层模型和TCP/IP四层模型
计算机网络是通过通信线路和通信设备连接的许多的分散独立工作的计算机系统,遵从一定的协议用软件实现资源共享的系统
用户10925563
2024/06/04
3.8K0
网络基础:OSI七层模型和TCP/IP四层模型
OSI七层模型与TCP/IP五层模型
        博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术。下面就开始搞了。
smy
2019/03/22
1.2K0
OSI七层模型与TCP/IP五层模型
OSI七层模型 原
模型把网络通信的工作分为7层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。由低到高具体分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
wuweixiang
2018/08/14
1.1K0
OSI七层模型
                                                                            原
深入浅出-网络七层模型
引言 今天回顾一下--网络七层模型&&网络数据包 网络基本概念 OSI模型 OSI 模型(Open System Interconnection model)是一个由国际标准化组织?提出的概念模型,试
sunsky
2020/08/20
18K0
深入浅出-网络七层模型
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
OSI(开放系统互联模型,Open Systems Interconnection Model)是一个用于理解和描述计算机网络体系结构的标准化框架,由国际标准化组织(ISO)于1984年制定。该模型将计算机网络通信划分为七个不同的层次,每个层次都执行特定的功能,并且每个层次都依赖于其下一层的服务。
小小工匠
2023/09/18
15.2K0
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
OSI七层模型具体解释
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最基本的功能就是帮助不同类型的主机实现传输数据 。
全栈程序员站长
2022/07/12
6600
OSI七层模型具体解释
图解OSI七层模型,2024最强科普!
公众号后台有小伙伴让我讲一下OSI七层模型,这个概念以前其实讲过很多遍了,而且属于网络技术领域中最基本的概念,虽然是最基本的概念,在看的各位有谁能够说“我精通OSI”的?
网络技术联盟站
2025/01/15
1.9K0
图解OSI七层模型,2024最强科普!
TCP/IP OSI七层模型
应用层(Application layer)是七层OSI模型的第七层。应用层直接应用程序接口并提供常见的网络应用服务。应用层也向表示层发出请求。应用层是开放系统的最高层,是直接为应用进程提供服务的。
网络豆
2023/10/15
9960
TCP/IP OSI七层模型
什么是OSI七层模型
OSI 七层模型(Open Systems Interconnection,开放系统互联)是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系结构。它将通信系统划分为七个层次,每个层次负责不同的功能,从物理连接到最终用户的应用。
程序员朱永胜
2023/11/15
6330
什么是OSI七层模型
网络入门(基础知识和网络整体的认识)
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
雪芙花
2022/10/31
8540
网络入门(基础知识和网络整体的认识)
网络基础Linux
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域 网.
ljw695
2024/11/21
830
网络基础Linux
网络原理(一)——协议分层
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
海盗船长
2020/08/27
1.8K0
初识网络基础
由于缺乏互联性,早期的计算机系统无法实现有效的资源共享。只能依靠光驱和网盘经行将数据拷贝,线下将数据经行传输,每台计算机都需要独立处理自己的任务和数据,导致资源利用率较低。这促使了计算机网络的发展,以实现计算机之间的通信和协作。
薄荷冰
2024/02/06
1360
初识网络基础
OSI七层模型学习笔记
  OSI模型全名Open System InterConnect 即开放式系统互联,是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。
那一叶随风
2018/08/22
8560
OSI七层模型学习笔记
大白话聊OSI七层模型和TCP/IP四层模型
小伙伴们可能有疑问,这个东西还用写文章吗,太基础了吧,网上文章多的是,随便一搜索就能找到。
HUC思梦
2020/10/28
10.8K0
大白话聊OSI七层模型和TCP/IP四层模型
深入解析OSI七层模型及各层工作原理(我只能帮你到这了)
我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。
不吃小白菜
2020/09/03
12.5K0
深入解析OSI七层模型及各层工作原理(我只能帮你到这了)
Linux网络-基础概念
注:虚拟机中的mac地址不是真实的mac地址, 可能会冲突;也有些网卡支持用户配置mac地址
用户9645905
2022/11/30
6190
Linux网络-基础概念
OSI七层网络模型相关知识点总结
HTTP(SPDY、HTTP/2)FTP SMTP(简单邮件传输协议) TELNET(远程登录协议) SNMP(简单网络管理协议,基于UDP)
_咯噔_
2022/02/13
9060
linux网络编程系列(一)--OSI七层模型和TCP-IP四层模型
为使不同计算机厂家之间的计算机能够互相通信,以便在更大的范围内建立计算机网络,国际标准化组织ISO在1981年正式推出了一个网络系统结构--OSI七层网络模型,此后各大计算机厂商迅速向它靠拢,大大推动了计算机网络的发展。OSI七层网络模型分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
cpp加油站
2021/04/16
8210
linux网络编程系列(一)--OSI七层模型和TCP-IP四层模型
相关推荐
简单认识OSI(计算机网络分层)七层模型
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 概述
  • awk 内置变量使用
    • 内置变量表
    • 栗子
      • root开头的那一行
      • 设置字段分隔符号(FS使用方法)
      • 记录条数(NR,FNR使用方法)
      • 设置输出字段分隔符(OFS使用方法)
      • 设置输出行记录分隔符(ORS使用方法)
      • 输入参数获取(ARGC ,ARGV使用)
      • 获得传入的文件名(FILENAME使用)
      • 获得linux环境变量(ENVIRON使用)
      • 输出数据格式设置:(OFMT使用)
      • 按宽度指定分隔符(FIELDWIDTHS使用)
      • RSTART RLENGTH使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档