首页 > 其他分享 >awk命令详解

awk命令详解

时间:2023-08-04 10:58:02浏览次数:30  
标签:etc passwd 命令 详解 awk 分隔符 print NR

awk变量

1、主要作用

用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组

2、格式

2.1 awk [选项] '匹配规则和处理规则 ' [处理文本路径]

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd

匹配规则主要是:正则表达式

处理规则主要是:

  设置变量

  设置数组

  定义函数(用的比较少)

  数组循环

  加减乘除运算

  字符串拼接

2.2 匹配规则

  字符串

  正则表达式

2.3 处理规则

  • BEGIN{} : BEGIN是在awk处理文本之前运行
  • // : 使用的匹配规则
  • {} :循环(每次只处理一行数据)
  • END{} :当所有的处理全部执行完毕之后,执行END中的相关操作

案列1:把/etc/passwd中的包含root的行打印出来

awk -F: '/root/' /etc/passwd

 案例2:把/etc/passwd中以root开头的行打印出来

awk -F: '/^root/' /etc/passwd

 案例3:/etc/passwd中匹配第三列和第五列的数据

awk -F: '{print $5,$3}' /etc/passwd

 案例4:打印以root或者ftp开头的行的解析器

awk -F: '/^root|^ftp/{print $7}' /etc/passwd
或者
awk -F: '/^(root|ftp)/{print $7}' /etc/passwd

3、工作原理

(1)awk会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行也可称为一个记录,行的边界是以换行符作为结束(表明:awk是一行一行的去处理文本的)

awk -F: '{print $0}' /etc/passwd

 (2)然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段

注意:如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格,如果说要指定分隔符,需要使用-F参数或者重新定义FS变量

awk -F: '{print $2}' /etc/passwd

 (3)使用print函数打印,如果$1$3之间没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号

awk -F: '{print $1,$3}' /etc/passwd

4、awk参数

参数 解释
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f  从脚本文件中读取awk命令

对于awk而言,变量分为

  1. 内置变量
  2. 外置变量
内置变量 解释
FS

输入字段分隔符,默认为空白字符

OFS  输入字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时指定符号代替换行符
NF NF:number of Filed,当前行的字段的个数(即当前行被分割了几列),字段数量
NR NR:行号,当前处理文本行的行号
FNR FNR:各文件分别计数的行号
FLIENAME FLIENAME:当前文件名
ARGC ARGC:命令行参数的个数
ARGV ARGV:数组,保存的是命令行所指定的各参数  

 

案列1:自定义输出内容

awk,必须外层单引号,内层双引号

内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号

awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd

 

案列2:显示文件的行号

NR表示文件的行号,NR==5表示行号是5的那一行

注意一个等于号,是修改变量值得意思,两个等于号是关系运算符,是“等于”的意思

 awk 'NR==5' passwd 

 

 显示文件2-5行内容

awk 'NR==2,NR==5' passwd 

 显示文件2-5行且输出行号

awk 'NR==2,NR==5 {print NR,$0}' passwd 

 案列3:显示文件的第一列,倒数第二和倒数第三列

awk '{print $1,$(NF-1)}' test.txt 
awk '{print $1,$(NF-1),$(NF-2)}' test.txt

 案列4:awk分隔符

  输入分隔符:awk默认是空格,空白字符,变量名是FS

  输出分隔符:简称OFS

FS输入分隔符:awk逐行处理文本的时候,以输入分割符为准,把文本切成多个片段,默认符号是空格,当我们处理特殊文本的时候,没有空格的时候,可以自由指定分割符特点

awk -F ":" '{print $1}' passwd

 除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-v选项搭配,修改FS变量

awk -v FS=":" '{print $1,$NF}' passwd 

 OFS输出分割符:awk执行完命令,默认用空格隔开每一列,这个空格就是awk的默认输出符。可以通过OFS指定分隔符

awk -F ":" -v OFS="--" '{print $1,$NF}' passwd 

案列5:处理多个文件显示行号

#普通的NR变量,会将多个文件按照顺序排序
awk '{print NR,$0}' old.txt test.txt 

#使用FNR可以分别对文件行数进行计数
awk '{print FNR,$0}' old.txt test.txt 

 案列6:内置变量RS和ORS

ORS是输出分隔符的意思,awk默认认为,每一行结束了,就得添加回车换行符

ORS可以更改输出符

awk -v ORS="xiaonuo666" '{print NR,$0}' test.txt

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

 案例7:ARGC和ARGV

ARGV表示的是一个数组,数组中保存的是命令行所给的参数

awk 'BEGIN{print "开始用awk了"}{print ARGV[0],$0}' test.txt
awk 'BEGIN{print "开始用awk了"}{print ARGV[1],$0}' test.txt 
awk 'BEGIN{print "开始用awk了"}{print ARGV[0],ARGV[1]}' test.txt 

案例8:自定义变量 

  方法一:-v varName=value

  方法二:在程序中直接定义

awk -v myname="xiaonuo" 'BEGIN{print "我的名字是?",myname}'

myname="xiaonuo"
awk -v awk_name=$myname 'BEGIN{print awk_name}'

5、awk pattern

回顾一下awk的语法

awk [option] 'pattern[action]' file...

现在讲解特殊的pattern:BEGIN和END

BEGIN模式是处理文本之前需要执行的操作

END模式是处理所有行之后需要执行的操作

awk 'BEGIN{print "文本之前的操作开始了"}{print $0}END{print "END操作开始了"}' test.txt

awk模式

关系运算符 解释 示例
< 小于 x<y
<= 小于等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>=

大于等于

x>=y
> 大于 x>y
~ 匹配正则 x~/正则/
!~ 不匹配正则 x!~/正则/

awk与正则表达式

正则表达式主要与awk的pattern模式结合使用

  不指定模式,awk每一行都会执行对应的动作

  指定模式,只有被模式匹配到的,符合条件的才会执行动作

awk '/正则表达式/动作'  /etc/passwd

 

  awk使用正则表达式,必须把正则放入“//”双斜杠中,匹配到结果后执行动作{print $0},打印整行信息

行范围模式

awk '/正则1/,/正则2/{动作}' file.txt

 

标签:etc,passwd,命令,详解,awk,分隔符,print,NR
From: https://www.cnblogs.com/gengxiaonuo/p/17603636.html

相关文章

  • Xcode Snippets 功能详解
    http://nshipster.com/xcode-snippets/iOSdevelopmentallbutrequirestheuseofXcode.Toitscredit,Xcodehasimprovedprettyconsistentlyoverthelastcoupleofyears.Sure, itstillhasits…quirks,buthey—thingscouldbe much,muchworse.Workingi......
  • React Hooks 中的属性详解
    ReactHooks是React16.8版本中新增的特性,允许我们在不编写class的情况下使用state和其他的React特性。Hooks是一种可以让你在函数组件中“钩入”React特性的函数。以下是一些常用的ReactHooks,并附有详细的用法和代码示例。1.useStateuseState是一个Hook函数,让......
  • 第一节:Lvs软件负载技术详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Hive Merge详解
    说明Hive在2.2版本之后开始支持Merge操作,并且Merge只能在支持ACID的表上执行语法MERGEINTO<targettable>ASTUSING<sourceexpression/table>ASSON<booleanexpression1>WHENMATCHED[AND<booleanexpression2>]THENUPDATESET<setclauselist>WHEN......
  • 9.2.Config Server 配置规则详解
    9.2.ConfigServer配置规则详解在上面,我们用于测试的配置文件:futurecloud.ymlfuturecloud-dev.ymlfuturecloud-test.ymlfuturecloud-pre.ymlfuturecloud-stable.ymlfuturecloud-apigetway-zuul.yml“-”前面的部分可以随便定义,一般我们用应用名来定义,后面的deb、test…也可以随......
  • spring-mvc系列:详解@RequestMapping注解(value、method、params、header等)
    目录一、@RequestMapping注解的功能二、@RequestMapping注解的位置三、@RequestMapping注解的value属性四、@RequestMapping注解的method属性五、@RequestMapping注解的params属性六、@RequestMapping注解的header属性七、SpringMVC支持ant分格的路径八、SpringMVC支持路径中的占......
  • Zookeeper基础命令
    一、事件监听在ZooKeeper中,可以通过注册事件监听器来监视ZNode的状态变化和节点的子节点变化1.stat-wpath1#NodeCreated创建2#NodeDataChanged修改3#NodeDeleted删除4stat-wpath2.ls-wpaht1#NodeDeleted删除2ls-wpath3.get-w/no......
  • 【jmeter系列】仅一次控制器+正则表达式用法详解
    一、仅一次控制器做性能测试经常遇到这样的问题:要做接口压力测试,但是需要登录接口返回的token,但是不需要对登录接口进行压测,这个时候jmeter仅一次控制器就起到了关键性的作用。具体操作如下:1、添加仅一次控制器,并在控制器下添加登录接口 2、登录接口返回响应数据-Responesb......
  • Confluence OGNL表达式注入命令执行漏洞(CVE-2022-26134)
    ConfluenceOGNL表达式注入命令执行漏洞(CVE-2022-26134)简介AtlassianConfluence是企业广泛使用的wiki系统。2022年6月2日Atlassian官方发布了一则安全更新,通告了一个严重且已在野利用的代码执行漏洞,攻击者利用这个漏洞即可无需任何条件在Confluence中执行任意命令。受影响版本......
  • ensp常用命令
    ensp常用命令最近在学习华为服务器相关知识,所以避免不了使用ensp做网络拓扑练习,而指令才让我头疼,所以就把自己常用的命令先记录下来。基础命令命令缩写含义system-viewsys进入quitq退出sysnamesysname重命名vlan命令缩写含义displayvlan......