awk -f 分隔符 命令_linux awk 命令实用手册

本文详细介绍了Linux的awk命令,包括基本概念、参数、内置变量、内建函数、运算符以及丰富的使用案例,如-F指定分隔符、使用内置变量和函数、模式匹配、逻辑操作等,帮助读者掌握awk在处理文本文件中的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

312f16ff88fb0d02e7959f9cf312fd79.png

9aac3be5a783a233cfeb452ff03269a5.png

0,简介

Linux awk 是一个实用的文本处理工具,它不仅是一款工具软件,也是一门编程语言awk 的名称来源于其三位作者的姓氏缩写,其作者分别是Alfred AhoPeter WeinbergerBrian Kernighan

如果你在linux 系统中追踪awk,可以看到其最终指向的是/usr/bin/gawk,也就是gawk 命令。其GNU官方手册 权威且全面,但对于初学者并不是很友好,因为内容非常多,你可能不知从何看起。对于普通用户,一般也用不到非常复杂的功能。

如果一个文件由规则的多个列组成,则非常适合使用awk 来处理。本文介绍awk 常用方法,对于普通使用者应该是足够了。

1,基本概念

awk 命令会对文本文件每一行进行处理,其语法格式如下:

awk `参数` `pattern {action}` `filename`

pattern 是要匹配的规则,action 是要执行的动作,只有匹配了pattern,才会执行动作action

这句命令的含义是:对于文件filename 的每一行,如果能够符合条件pattern,则执行动作action。如果不写pattern,则表示对于文件filename的每一行,都进行action 处理。

1.1,参数

awk 最常使用的参数是-F,其后跟一个分隔符或者正则表达式,其表示的意思是以怎样的规则对每一行进行分割。 默认是空格Tab键

1.2,pattern

pattern 可以是下表中的任意一项:

1.3,action

actionawk 语句组成,比如print,用于输出。

2,awk 内置变量

awk 中内置了很多变量,来方便使用,这里介绍一些常用的:

3,awk 内建函数

awk 常用函数如下:

4,awk 运算符

awk 支持如下常用运算符

5,awk 使用案例

假如,我们有如下文件,分别为姓名性别年龄成绩等级省份

>>> cat log.txt 
_________________
小明,男,23,550^优秀---北京
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西

5.1 使用-F

以逗号,分隔符,并将第1列,第2列和第3列输出,如下:

>>> awk -F, '{print $1,$2,$3}' log.txt 
______________________________________
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23

分隔符只有一个字符时,分割符可以紧挨-F,还有如下几种写法:

awk -F , '{print $1,$2,$3}' log.txt     #`分隔符`与`-F`之间有一个空格
awk -F',' '{print $1,$2,$3}' log.txt    #`分隔符`用单引号引住,并且紧挨`-F`
awk -F"," '{print $1,$2,$3}' log.txt    #`分隔符`用双引号引住,并且紧挨`-F`
awk -F ',' '{print $1,$2,$3}' log.txt   #`分隔符`用单引号引住,与`-F`之间有空格
awk -F "," '{print $1,$2,$3}' log.txt   #`分隔符`用双引号引住,与`-F`之间有空格

分隔符多个连续字符时,必须用双引号或者单引号引住分割符,可以紧挨-F,也可以有空格

awk -F '---' '{print $2}' log.txt   #`分隔符`用单引号引住,与`-F`之间有空格
awk -F"---" '{print $5}' log.txt    #`分隔符`用双引号引住,与`-F`之间没有空格

以上两个命令输出的内容一样,此时分隔符---,每一行都被分成了两列,如下:

小明,男,23,550^优秀 北京
小丽,女,22,560^优秀 河北
小磊,男,24,530^良好 河南
小召,男,23,540^优良 山东
小欣,女,23,545^优良 山西

当有多个单独的分割符时,将多个分隔符写在中括号[]中,如下,表示以, 或者以--- 为分隔符:

>>> awk -F "[,^]" '{print $1, $2, $3, $4, $5}' log.txt 
________________________
小明 男 23 550 优秀---北京
小丽 女 22 560 优秀---河北
小磊 男 24 530 良好---河南
小召 男 23 540 优良---山东
小欣 女 23 545 优良---山西

5.2 使用内置变量

我们用变量NR输出当前行号,变量NF输出当前行的列数,变量FILENAME输出当前文件名,如下:

>>> awk -F"---" '{print NR, $1, $2, NF, FILENAME}' log.txt
__________________________________________________________
1 小明,男,23,550^优秀 北京 2 log.txt
2 小丽,女,22,560^优秀 河北 2 log.txt
3 小磊,男,24,530^良好 河南 2 log.txt
4 小召,男,23,540^优良 山东 2 log.txt
5 小欣,女,23,545^优良 山西 2 log.txt

5.3 如何连接字符串

我们将每一列使用竖线| 分割,方法是将分隔符双引号引住,然后紧挨变量,如下:

>>> awk -F"---" '{print NR"|"$1"|"$2"|"NF"|"FILENAME}' log.txt
__________________________________
1|小明,男,23,550^优秀|北京|2|log.txt
2|小丽,女,22,560^优秀|河北|2|log.txt
3|小磊,男,24,530^良好|河南|2|log.txt
4|小召,男,23,540^优良|山东|2|log.txt
5|小欣,女,23,545^优良|山西|2|log.txt

5.3 使用内置函数

使用内置函数systime() 输出时间戳,如下:

>>> awk -F"---" '{print NR"|"$1"|"$2"|"NF"|"FILENAME"|"systime()}' log.txt
—————————————————————————————————————————————
1|小明,男,23,550^优秀|北京|2|log.txt|1587022443
2|小丽,女,22,560^优秀|河北|2|log.txt|1587022443
3|小磊,男,24,530^良好|河南|2|log.txt|1587022443
4|小召,男,23,540^优良|山东|2|log.txt|1587022443
5|小欣,女,23,545^优良|山西|2|log.txt|1587022443

使用length 输出行长度大于5 的行:

>>> awk 'length>5' log.txt
——————————————————————————
小明,男,23,550^优秀---北京
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西

5.4 使用pattern

使用pattern 只输出 同学信息,$0 表示每一行的原始内容,如下:

>>> awk '/男/ {print NR"|"$0}' log.txt
__________________________
1|小明,男,23,550^优秀---北京
3|小磊,男,24,530^良好---河南
4|小召,男,23,540^优良---山东

5.5 使用逻辑非!

使用逻辑非!,输出不为的学生信息:

>>> awk '!/男/ {print NR"|"$0}' log.txt
__________________________
2|小丽,女,22,560^优秀---河北
5|小欣,女,23,545^优良---山西

5.6 使用关系表达式

使用关系表达式,输出年龄为23 的学生信息:

# 以逗号分割后的第三列为年龄
>>> awk -F, '$3==23 {print $3, $0}' log.txt
____________________________
23 小明,男,23,550^优秀---北京
23 小召,男,23,540^优良---山东
23 小欣,女,23,545^优良---山西

也可以写成如下方式,输出年龄为23或25 的学生信息:

>>> awk -F, '$3==23 || $3==25' log.txt
________________________
小明,男,23,550^优秀---北京
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西

5.7 使用模式匹配表达式

使用模式匹配表达式,输出年龄为24 的学生信息:

awk -F, '$3 ~/24/ {print $3, $0}' log.txt
24 小磊,男,24,530^良好---河南

5.8 使用if 语句

awk 也支持if 语句,输出年龄为22 的学生信息,if 语句写在大括号{}内:

>>> awk -F, '{if($3==22) print $3, $0}' log.txt
___________________________
22 小丽,女,22,560^优秀---河北

5.9 使用NR 输出基数行

# `NR % 2 == 1` 为基数行
>>> awk -F, 'NR % 2 == 1 {print NR, $0}' log.txt
——————————————————————————
1 小明,男,23,550^优秀---北京
3 小磊,男,24,530^良好---河南
5 小欣,女,23,545^优良---山西

5.10 使用NF 输出倒数第一列

$(NF) 为倒数第1列,$(NF-1) 为倒数第2列,$(NF-2) 为倒数第3列,依次类推。

如下输出倒数第1列:

>>> awk -F, '{print $(NF)}' log.txt
______________
550^优秀---北京
560^优秀---河北
530^良好---河南
540^优良---山东
545^优良---山西

5.11 使用BEGIN 块

BEGIN 块中可以是任意多个合法的awk 语句

>>> awk -F, 'BEGIN{print "姓名", "性别", "年龄"} {print $1, $2, $3}' log.txt 
____________
姓名 性别 年龄
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23

5.12 使用END 块

END 块中可以是任意多个合法的awk 语句BEGIN 块END 块可以一起使用。

>>> awk -F, 'BEGIN{print "姓名", "性别", "年龄"} {print $1, $2, $3} END{print "共有"NR"行信息"}' log.txt 
____________
姓名 性别 年龄
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23
共有5行信息

5.13 使用范围模板

输出小丽和小欣之间的行数据:

>>> awk '/小丽/,/小欣/' log.txt 
______________________________
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西

(完。)

此插件为跨域插件,打开后可跨域访问接口,旧版浏览器可直接拖到扩展程序中安装,新版浏览器需要将扩展名修改成rar并解压,然后点击“加载已解压的扩展程序”安装。 ======================插件概述谷歌译文====================== 轻松将(Access-Control-Allow-Origin:*)规则添加到响应标头。 允许CORS:通过Access-Control-Allow-Origin,您可以轻松地在Web应用程序中执行跨域Ajax请求。 只需激活插件并执行请求。默认情况下(在JavaScript API中),CORS或跨源资源共享在现代浏览器中被阻止。安装此加载项将使您可以解除阻止此功能。请注意,将插件添加到浏览器后,默认情况下它处于非活动状态(工具栏图标为灰色C字母)。如果要激活加载项,请按一次工具栏图标。图标将变为橙色的C字母。 ======================插件概述谷歌译文====================== ========================插件概述原文======================== Easily add (Access-Control-Allow-Origin: *) rule to the response header. Allow CORS: Access-Control-Allow-Origin lets you easily perform cross-domain Ajax requests in web applications. Simply activate the add-on and perform the request. CORS or Cross Origin Resource Sharing is blocked in modern browsers by default (in JavaScript APIs). Installing this add-on will allow you to unblock this feature. Please note that, when the add-on is added to your browser, it is in-active by default (toolbar icon is grey C letter). If you want to activate the add-on, please press on the toolbar icon once. The icon will turn to orange C letter. ========================插件概述原文========================
Access-Control-Allow-OriginCORS(跨域资源共享)中的一个关键字段。它用于确定哪些源(域)可以访问特定的资源。在CORS中,服务器通过在HTTP响应头中设置Access-Control-Allow-Origin字段来指定允许访问该资源的源。 根据引用,Access-Control-Allow-Origin的值是单数,表示只允许一个源进行访问。如果设为Access-Control-Allow-Origins,则表示允许多个源进行访问。 根据引用,可以通过设置HTTP响应头中的Access-Control-Allow-Origin字段来指定允许访问资源的源。例如,可以设置多个Access-Control-Allow-Origin字段,每个字段对应一个允许访问的源。 根据引用,Access-Control-Allow-Origin字段也可以设置为星号(*),表示允许任意跨源请求。这意味着任何源都可以访问该资源。 总结起来,Access-Control-Allow-OriginCORS中用于确定哪些源可以访问特定资源的字段,它可以单独指定一个源,也可以设置多个源,甚至可以设置为星号表示允许任意跨源请求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Cors跨域(三):Access-Control-Allow-Origin多域名?](https://blog.youkuaiyun.com/f641385712/article/details/117902613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Access-Control-Allow- 设置跨域资源共享CORS详解](https://blog.youkuaiyun.com/zhangge3663/article/details/117409636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值