首页 > 系统相关 >Linux脚本攻略学习笔记之awk分隔符、变量实例演示

Linux脚本攻略学习笔记之awk分隔符、变量实例演示

时间:2023-05-24 10:31:47浏览次数:45  
标签:输出 变量 Linux ARGV awk 分隔符 print



  • 一、分隔符
  • 1、输入分隔符
  • 1.1 -F
  • 1.2、内部变量 -v
  • 2、输出分隔符
  • 二、awk内部变量
  • 2.1NR 行号 NF列数
  • 2.2、FNR
  • 2.3 、RS
  • 2.4、ORS
  • 2.5、FILENAME
  • 2.6、ARGC
  • 2.7、自定义变量



我们略微提到过"分隔符",但是并没有细说,那么我们今天就聊聊什么是分隔符,awk有哪些分隔符,awk的默认分割符是空格,但是,这样描述并不精确,因为,awk的分隔符还分为两种,“输入分隔符” 和 “输出分隔符” 。


输入分隔符,英文原文为field separator,此处简称为FS


输入分割符,默认是空白字符(即空格),awk默认以空白字符为分隔符对每一行进行分割。


输出分割符,英文原文为output field separator,此处简称为OFS


awk将每行分割后,输出在屏幕上的时候,以什么字符作为分隔符,awk默认的输出分割符也是空格。

一、分隔符

1、输入分隔符

1.1 -F

如下文本

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk分隔符实例演示

默认输入分隔符是空格,我们还可以指定其他字符作为分隔符。

awk -F@ '{print $1,$2 }' fs.txt # 这里就是awk 语法加上[options]

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk变量实例演示_02


可以看到,通过-F 选项,指定了使用@号作为输入分隔符,awk 将文本中的每一行都按照@分隔。

1.2、内部变量 -v

除了使用 -F 选项指定输入分隔符,还能够通过设置内部变量的方式,指定awk的输入分隔符,awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS=’@’,如下图。

awk -v FS='@' '{ print $1 $2 }'  fs.txt

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_分隔符_03

2、输出分隔符

当awk为我们输出每一列的时候,会使用空格隔开每一列,其实,这个空格,就是awk的默认的输出分隔符,下图中红框标注的空格部分,就是awk的默认的输出分隔符。

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_数组_04


指定输入和输出分隔符

awk  -v FS='@' -v OFS='#' '{print $1,$2 }' fs.txt
#指定输出分隔符为#

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk分隔符实例演示_05


注意如果print 中多个参数不使用逗号的话,输出结果回直接拼接在一起。

二、awk内部变量

在上面输入分隔符的第二个实例中就是用awk内部变量实现的。那什么是awk内部变量呢?
对于awk来说"变量"又分为"内置变量" 和 “自定义变量” , "输入分隔符FS"和"输出分隔符OFS"都属于内置变量。内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量.
awk常用内置变量:
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符, 默认为空白字符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数

2.1NR 行号 NF列数

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_数组_06

第二个字段NF 表示每一行都有5列.
注意这里同样$0 ,Linux脚本攻略学习笔记之awk分隔符、变量实例演示_Linux脚本攻略学习笔记_07’符号,而NR,NF则不需要。在awk中只有引用像$0 ,Linux脚本攻略学习笔记之awk分隔符、变量实例演示_分隔符_08
引用其他变量时,不管是内置还是自定义变量,都不使用Linux脚本攻略学习笔记之awk分隔符、变量实例演示_分隔符_09

2.2、FNR

当使用 NR显示多个文件时,看到 多个文件的所有行会按照顺序进行排序。

awk  '{ print NR,$0}' col_print.txt file2.txt

看到结果中,FNR 则会分别显示各个文件的行号

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_数组_10

2.3 、RS

RS是输入行分隔符,如果不指定,默认的"行分隔符"就是我们所理解的"回车换行"。假设,我们不想以默认的"回车换行"作为"行分隔符",而是想使用空格作为所谓的行分隔符,也就是说,我们想让awk认为,每遇到一个空格,就换行,换句话说,我们想让awk以为每次遇到一个空格就是新的一行。

示例如下

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_Linux脚本攻略学习笔记_11

awk -v RS=' ' '{ print NR,$0 }' RS.test

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk变量实例演示_12


从上图可以看到,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于是awk就将文本换行了,而此时人类理解的"回车换行",对于awk来说并不是所谓的换行符,所以才会出现上图中第2行和第3行的现象,即使从人类的角度去看是两行文本,但是在awk的世界观里,它就是一行。

理解了输入行分隔符后,同理再来看输出行分隔符。

2.4、ORS

默认情况下,awk将人类眼中的"回车换行",当做"输出行分隔符",此时,awk的"世界观"与人类的"世界观"是相同的。

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk变量实例演示_13


awk -v ORS=’#’ ‘{ print NR,$0 }’ RS.test

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk变量实例演示_14


看到awk 在处理文本后输出换行符已不在时默认的回车符了,而是#,尽管直观上我们看到这明明是一行数据,而而awk认为它是三行数据。

2.5、FILENAME

这个内置变量,从字面上,就能看出是什么意思,没错,就是显示文件名,演示效果如下

awk  '{print  FILENAME ,$0}'  col_print.txt file2.txt

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_Linux脚本攻略学习笔记_15

2.6、ARGC

ARGV 内置变量表示命令行参数的个数, ARGV内置变量表示的是一个数组,这个数组中保存的是命令行所给定的参数。这样解释还是很模糊,不容易理解,我们来看看示例。

awk 'BEGIN {print "BEING"}' col_print.txt  file2.txt

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_分隔符_16

awk 'BEGIN {print "BEING" ,ARGV[1],ARGV[2]}' col_print.txt  file2.txt

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk分隔符实例演示_17


ARGV内置变量表示的是一个数组,既然是数组,就需要用上图中的下标的方式,引用对应元素的值,因为数组的索引都是从0开始的,所以,ARGV[1]表示引用ARGV数组中的第二个元素的值,从返回结果可以看出,ARGV[1]对应的值为col_print.txt,同理,ARGV[2]的值,发现ARGV[2]对应的值为file2.txt,这个时候,你明白ARGV内置变量的含义了吗,说白了,ARGV内置变量表示的是:所有参数组成的数组。 ARGV[0]对应的是哪个参数呢?如下

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_分隔符_18


awk就是这么规定的,'pattern{ action }'并不被看做是参数,awk被看做为参数。那对于ARGC则表示参数的数量,也可以理解为ARGV数组的长度。示例如下

awk 'BEGIN {print ARGV[0],ARGV[1],ARGV[2],ARGC}' col_print.txt  file2.txt

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk分隔符实例演示_19

2.7、自定义变量

1、 -v varname=value 变量名区分字符大小写。
2、在program中直接定义。
示例演示1、

awk -v var1=v1 'BEGIN {print var1}'

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_Linux脚本攻略学习笔记_20

awk  'BEGIN {var1="v1";print var1}' 
#注意,变量定义与动作之间需要用分号";"隔开。

Linux脚本攻略学习笔记之awk分隔符、变量实例演示_awk分隔符实例演示_21


标签:输出,变量,Linux,ARGV,awk,分隔符,print
From: https://blog.51cto.com/u_14016692/6337625

相关文章

  • Linux 常用命令大全【yyds干货盘点1】
    1. 系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读取操作cat/proc/cp......
  • 测试工程师需要掌握的linux知识
    1.测试人员学习Linux用途查看日志环境搭建性能监控2.测试常用命令 用途命令示例常见的操作常看当前路径pwd  查看文件夹中的文件的详细信息ll  查看文件夹中的文件ls  打开文件夹cd.当前文件夹~......
  • 坚持了十年的德国慕尼黑城市政府将抛弃Linux回归Windows?
    德国慕尼黑城市政府正在考虑回归到微软Windows系统的怀抱。慕尼黑行政管理局和人事委员会建议将Linux系统转换成Win10系统。根据报告显示,之所以做出此决定是因为德国慕尼黑城市政府目前所面临的软件兼容性问题:行政管理局和人事委员会本周对慕尼黑IT设置组织做了长久期盼的建议,......
  • 坚持了十年的德国慕尼黑城市政府将抛弃Linux回归Windows?
    德国慕尼黑城市政府正在考虑回归到微软Windows系统的怀抱。慕尼黑行政管理局和人事委员会建议将Linux系统转换成Win10系统。根据报告显示,之所以做出此决定是因为德国慕尼黑城市政府目前所面临的软件兼容性问题:行政管理局和人事委员会本周对慕尼黑IT设置组织做了长久期盼的建议,......
  • 坚持了十年的德国慕尼黑城市政府将抛弃Linux回归Windows?
    德国慕尼黑城市政府正在考虑回归到微软Windows系统的怀抱。慕尼黑行政管理局和人事委员会建议将Linux系统转换成Win10系统。根据报告显示,之所以做出此决定是因为德国慕尼黑城市政府目前所面临的软件兼容性问题:行政管理局和人事委员会本周对慕尼黑IT设置组织做了长久期盼的建议,......
  • linux配置双网卡主备模式
    配置网卡1BOOTPROTO=noneONBOOT=yes新增MASTER=bond0新增SLAVE=yes配置网卡2BOOTPROTO=noneONBOOT=yes新增MASTER=bond0新增SLAVE=yestouch或者cp新虚拟网卡文件touchifcfg-bond0DEVICE=bond0ONBOOT=yesBOOTPROTO=noneIPADDR=NETMASK=GATEWAY=DNS1=DNS2=BONDING_OPTS="mode=1mii......
  • Linux安装软件包(b站up主"码农论坛"所讲的做的笔记)
    在线安装/升级:yum-yinstall 软件包名删除软件:yum-yremove 软件包名如果不确定软件包名, 可以百度一下yum(YellowdogUpdater,Modified) 可以解决软件包的依赖关系, 下面另一种方法却没有 ----------------------------------------------------------------......
  • Linux常用命令(b站up主"码农论坛"所讲的做的笔记)
    重启: reboot 或者 init6关机:init0 或者 halt清屏: clear查看IP:ipaddr查看时间:date修改时间: date-s"2020-5-212:22:22"复制:Ctrl+Insert 粘贴: Shift+Insert  这和WINDOWS上一样中止命令: Ctrl+c 意思是废除输入命令, 不执行查看当......
  • Redis源码安装(Linux环境)
     下载源码:wgethttps://download.redis.io/redis-stable.tar.gz  解压:tar-xzvfredis-stable.tar.gz  编译&安装:cdredis-stablemakePREFIX=~/redisinstall    =================================== ......
  • linux yum安装
    目录一、yum安装二、yum安装分类三、yum命令四、实验         一、yum安装yum:1.基于rpm升级,弥补rpm只能一个一个安装依赖文件2.yum可以自动安装依赖文件。3.从仓库中下载包 centos8:使用yum或者dhf(两种命令格式基本一致,......