1、AWK内置变量

AWK内置变量如下表:

awk内置变量 作用
$0 代表目前AWK所读入的整行数据。我们已知AWK是一行一行读入数据的,$0就代表当前读入行的整行数据。
$n 代表目前读入行的第n个字段。
NF 当前行拥有的字段(列)总数。
NR 当前AWK所处理的行,是总数据的第几行。
FS 用户定义分隔符。AWK的默认分隔符是任何空格(tab键或者空格),如果想要使用其他分隔符(如“:”),就需要FS变量定义。
ARGC 命令行参数个数。
ARGV 命令行参数数组。
FNR 当前文件中的当前记录数(对输入文件起始为1)。
OFMT 数值的输出格式(默认为%.6g)。
OFS 输出字段的分隔符(默认为空格)。
ORS 输出记录分隔符(默认为换行符)。
RS 输入记录分隔符(默认为换行符)。

2、练习说明

(1)$n变量练习

使用如下文本:

ID      Name    Python  Linux   MySQL   Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

比如我们提取文本中的第2列数据,执行如下命令:

[root@localhost tmp]# awk '{printf $2 "\n"}' student.txt
Name
Tangs
Sunwk
Zhubj
Shahs

(2)FS变量练习

AWK的默认分隔符是任何空格(tab键或者空格),如果想要使用其他分隔符,就需要FS变量定义。

cut命令默认是以tab键做为分隔符。

我们之前用cut命令提取过/etc/passwd文件中普通用户的用户名,现在我们来用AWK来提取能正常登陆用户的用户名。

执行如下命令:

[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\n"}'
root:x:0:0:root:/root:/bin/bash
user1
user2

说明:FS变量指定分隔符是一个单独的动作,而打印输出是另外一个动作。

看到上面的结果我们会发现,user1user2用户的信息正确提取了,而第一行root用户的信息,是把整行的数据都打印输出了,没有按:冒号做为分隔符来正确的提取。

是因为AWK先把一行数据读取进AWK中,然后在用后面的动作,再对读入的数据进行处理。

也就是说我已经把第一行的root用户的信息,已经读入到awk中,$0$1$2等变量已经赋值好了,然后才在后边的动作中看到你指定了:冒号作为分隔符,这个时候第一行数据已经来不及处理了,只能用AWK默认的处理方式,用空格作为分隔符来处理,这一行没有空格,就会把这一行的所有数据全部打印出来了。

到了处理第二行数据的时候,AWK已经知道要用:冒号作为分隔符,这个时候就可以正确处理数据了。

现在就需要用的BEGIN来处理这个问题,把分隔符的指定{FS=":"}放入BEGIN中就可以了。

[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\n"}'
root
user1
user2

这样就可以正确提取到我们需要的数据了。

所以在使用AWK的时候,如果需要手动指定分隔符,要把这个指定分隔符的动作写在BEGIN中。

总结:如果有明显的分隔符,推荐优先使用cut命令,因为简单。

但是如果需要一些判断的话,比如我需要根据用户ID,查看某一个用户的用户名。

这个时候用AWK就方便很多,cut命令就不能直接处理了,需要写脚本程序进行过滤。

比如打印uid=500的用户的用户名,命令如下:

[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} $3=="500" {printf $1 "\n"}'
user1 # $3=="500"也可以写成$3==500或者$3=/500/都可以

(3)NF变量和NR变量练习

我们还是以/etc/passwd文件中的内容为例,需求打印输出可登录的用户的用户名,用户ID,行号,字段数(也就是列数)。

执行如下命令:

# 提示:写法是,输出格式在双引号里,变量在双引号外。
[root@192 tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\t 行号:" NR "\t 字段数:" NF "\n"}'
root 0 行号:1 字段数:7
user1 500 行号:2 字段数:7
user2 501 行号:3 字段数:7

注意一下,最终传入AWK中处理的数据就三行,如下:

[root@192 tmp]# cat /etc/passwd | grep "/bin/bash"
root:x:0:0:root:/root:/bin/bash
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

3、总结:

我们就学会前5个AWK内置变量就可以了,后边的AWK内置变量一般用不到,换句话说就是能用Shell处理的,就少用AWK处理,以后如果真要用到AWK进行更深层次的编程,自己再单独的学习一下AWK。

『忘了再学』Shell基础 — 29、AWK内置变量的更多相关文章

  1. 『忘了再学』Shell基础 — 23、其他环境变量配置文件

    目录 1.注销时生效的环境变量配置文件 2.其他配置文件 3.Shell登录信息相关文件 (1)/etc/issue文件说明 (2)/etc/issue.net文件说明 (3)/etc/motd文件说 ...

  2. 『忘了再学』Shell基础 — 17、预定义变量

    目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...

  3. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  4. 『忘了再学』Shell基础 — 11、变量定义的规则和分类

    目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...

  5. 『忘了再学』Shell基础 — 2、Shell的作用与分类

    目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...

  6. 『忘了再学』Shell基础 — 12、用户自定义变量

    目录 1.变量定义 2.变量调用 3.变量的修改 4.查看变量 (1)-u选项说明: (2)-x选项说明: (3)set命令说明: 5.变量删除 1.变量定义 变量正确定义. 格式:变量名=" ...

  7. 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型

    目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...

  8. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  9. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

随机推荐

  1. 火狐浏览器Hackbar安装破解

    1 下载 https://pan.baidu.com/s/18cKoJAam9by7AB168Im57g 64mt 下载后解压到一个固定文件夹下 2 安装 选择xpi进行安装 3 关闭插件更新 点击插 ...

  2. toggleClass() 把本来的有的类名去掉 本来没有的 加上

    连续点击按钮可以交替颜色,就是改变class

  3. Codeforces Round #706 (Div. 2)B. Max and Mex __ 思维, 模拟

    传送门 https://codeforces.com/contest/1496/problem/B 题目 Example input 5 4 1 0 1 3 4 3 1 0 1 4 3 0 0 1 4 ...

  4. ICO图标在线生成转换网站

    ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件. 在Windows操作系统中,单个图标的文件名后缀是.ICO.这种格式的图标可以在W ...

  5. Python获取文件夹下的所有文件名

    1 #获取文件夹内的图片 2 import os 3 def get_imlist(path): 4 return [os.path.join(path,f) for f in os.listdir( ...

  6. python学习-Day29

    目录 今日内容详细 反射实际案例 面向对象的双下方法 __ str __ __ del __ __ getattr __ __ setattr __ __ call __ __ enter __ __ ...

  7. XSS攻击&CSRF攻击 ----Django解决方案

    XSS攻击: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执 ...

  8. 《计算机组成原理/CSAPP》网课总结(二)——编译原理基础

    这部分是四月份的安排,拖到五一放假了,主要是对源码编译过程的一次总结,总的来说,大致可分为预编译.编译.汇编和链接四部分.这里简单记录一下: 一 概述 1.预处理 或者说是预编译,指的是在编译前需要做 ...

  9. 这些 Shell 分析服务器日志命令集锦,收藏好

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站的访问量.看看 ...

  10. Kubernetes 从入门到进阶实战教程 (2021 最新万字干货版)

    作者:oonamao 毛江云,腾讯 CSIG 应用开发工程师原文:来源腾讯技术工程,https://tinyurl.com/ya3ennxf 写在前面 笔者今年 9 月从端侧开发转到后台开发,第一个系 ...