awk--正则匹配列中指定的字符

正则表达式的特点

正则表达式由以下内容组合而成:

  • 普通字符,例如空格、下划线、A-Z、a-z、0-9。
  • 可以扩展为普通字符的元字符,它们包括:
    • (.) 它匹配除了换行符外的任何单个字符。
    • (*) 它匹配零个或多个在其之前紧挨着的字符。
    • [ character(s) ] 它匹配任何由其中的字符/字符集指定的字符,你可以使用连字符(-)代表字符区间,例如 [a-f]、[1-5]等。
    • ^ 它匹配文件中一行的开头。
    • $ 它匹配文件中一行的结尾。
    • / 这是一个转义字符。

你必须使用类似 awk 这样的文本过滤工具来过滤文本。你还可以把 awk 自身当作一个编程语言。但由于这个指南的适用范围是关于使用 awk 的,我会按照一个简单的命令行过滤工具来介绍它。

awk 的一般语法如下:

# awk 'script' filename

此处 'script' 是一个由 awk 可以理解并应用于 filename 的命令集合。

它通过读取文件中的给定行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。

该脚本 'script' 中内容的格式是 '/pattern/ action',其中 pattern 是一个正则表达式,而 action 是当 awk 在该行中找到此模式时应当执行的动作。

一个使用 awk 的简单示例:

  • 下面的例子打印文件 /etc/hosts 中的所有行,因为没有指定任何的模式。
    • # awk '//{print}' /etc/hosts

结合模式使用 awk

  • 在下面的示例中,指定了模式 localhost,因此 awk 将匹配文件 /etc/hosts 中有 localhost 的那些行。
  • # awk '/localhost/{print}' /etc/hosts 

————————

在 awk 模式中使用通配符 (.)

在下面的例子中,符号 (.) 将匹配包含 loc、localhost、localnet 的字符串。

这里的正则表达式的意思是匹配 l一个字符c

# awk '/l.c/{print}' /etc/hosts

————————————

在 awk 模式中使用字符 (*)

在下面的例子中,将匹配包含 localhost、localnet、lines, capable 的字符串。

# awk '/l*c/{print}' /etc/localhost

你可能也意识到 (*) 将会尝试匹配它可能检测到的最长的匹配。

让我们看一看可以证明这一点的例子,正则表达式 t*t 的意思是在下面的行中匹配以 t 开始和 t 结束的字符串:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

当你使用模式 /t*t/ 时,会得到如下可能的结果:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

在 /t*t/ 中的通配符 (*) 将使得 awk 选择匹配的最后一项:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

————————————

结合集合 [ character(s) ] 使用 awk

以集合 [al1] 为例,awk 将匹配文件 /etc/hosts 中所有包含字符 a 或 l 或 1 的字符串。

# awk '/[al1]/{print}' /etc/hosts

下一个例子匹配以 K 或 k 开始头,后面跟着一个 T 的字符串:

# awk '/[Kk]T/{print}' /etc/hosts 

————————————

以范围的方式指定字符

awk 所能理解的字符:

  • [0-9] 代表一个单独的数字
  • [a-z] 代表一个单独的小写字母
  • [A-Z] 代表一个单独的大写字母
  • [a-zA-Z] 代表一个单独的字母
  • [a-zA-Z 0-9] 代表一个单独的字母或数字

让我们看看下面的例子:

# awk '/[0-9]/{print}' /etc/hosts

——————————————

结合元字符 (^) 使用 awk

在下面的例子中,它匹配所有以给定模式开头的行:

# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts

结合元字符 ($) 使用 awk

它将匹配所有以给定模式结尾的行:

# awk '/ab$/{print}' /etc/hosts
# awk '/ost$/{print}' /etc/hosts
# awk '/rs$/{print}' /etc/hosts

结合转义字符 (/) 使用 awk

它允许你将该转义字符后面的字符作为文字,即理解为其字面的意思。

在下面的例子中,第一个命令打印出文件中的所有行,第二个命令中我想匹配具有 $25.00 的一行,但我并未使用转义字符,因而没有打印出任何内容。

第三个命令是正确的,因为一个这里使用了一个转义字符以转义 $,以将其识别为 '$'(而非元字符)。

# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '//$25.00/{print}' deals.txt

附加例子:

awk正则匹配列中指定的字符

★ 范例一
◆ 打印指定列中匹配80开头并以80结束的行
● 关系符号注释
~ 关系操作符
~ 匹配正则
!~ 不匹配正则

#cat a.txt 
afjdkj 80
lkdjfkja 8080
dfjj 80
jdsalfj 808080
jasj 80
jg 80
linuxidc 80
80 ajfkj
asf 80
80 linuxidc

# awk '{if($2~/^80$/)print}' a.txt 
afjdkj 80
dfjj 80
jasj 80
jg 80
linuxidc 80
asf 80

--------------------------------------

★ 范例二
● 范例 2.1
◆ grep -v ffff过滤ipv6的地址,显示:80的行,删除A到Z和_对应的行,判断已:作为分隔符,打印第三列等于80的行。

# netstat -nat | grep -v ffff | grep ":80" | tr -d "[A-Z][_]"| awk -F : '{if($3==80)print}'
tcp        0      0 10.15.201.29:38393          123.125.106.196:80            
tcp        0      0 10.15.201.29:38383          60.28.236.116:80              
tcp        0      0 10.15.201.29:44949          60.28.236.112:80              
tcp        0      0 10.15.201.29:41445          60.28.236.116:80              
tcp        0      0 10.15.201.29:47630          60.28.236.112:80              
tcp        0      0 10.15.201.29:48624          60.28.236.116:80                
tcp        0      0 10.15.201.29:48129          60.28.236.116:80              
tcp        0      0 10.15.201.29:48837          60.28.236.112:80              
tcp        0      0 10.15.201.29:50506          60.28.236.112:80              
tcp        0      0 10.15.201.29:53923          60.28.236.112:80    

● 范例 2.2
◆ 不加grep ":80"一样可以查出正确结果

# netstat -nat | grep -v ffff | tr -d "[A-Z][_]"| awk -F : '{if($3==80)print}'
tcp        0      0 10.15.201.29:60047          118.67.112.70:80              
tcp        0      0 10.15.201.29:49038          123.125.106.196:80            
tcp        0      0 10.15.201.29:37035          123.125.106.196:80            
tcp        0      0 10.15.201.29:35936          118.67.112.70:80              
tcp        0      0 10.15.201.29:35972          60.28.236.112:80              
tcp        0      0 10.15.201.29:35056          60.28.236.116:80              
tcp        0      0 10.15.201.29:48777          60.28.236.112:80              
tcp        0      0 10.15.201.29:47173          60.28.236.116:80              
tcp        0      0 10.15.201.29:53014          60.28.236.116:80            
tcp        0      0 10.15.201.29:51816          60.28.236.112:80              
tcp        0      0 10.15.201.29:53109          60.28.236.112:80            
tcp        0      0 10.15.201.29:52274          60.28.236.112:80              
tcp        0      0 10.15.201.29:49854          60.28.236.116:80            
tcp        0      0 10.15.201.29:50339          60.28.236.112:80              
tcp        0      0 10.15.201.29:60595          60.28.236.116:80

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[2\]:在awk中,可以使用正则表达式来匹配和处理文本。正则表达式可以用于模式匹配、替换和提取文本等操作。可以在awk命令中直接使用正则表达式,也可以将正则表达式写入一个文件中,然后通过-f选项加载该文件。使用正则表达式时,可以使用一些特殊字符和元字符来表示不同的模式。例如,使用"."表示匹配任意字符,使用"*"表示匹配前一个字符的零个或多个实例,使用"\[\]"表示匹配括号内的任意一个字符等等。通过结合正则表达式和awk的其他功能,可以实现更加灵活和强大的文本处理操作。 问题:awk正则表达式能和-f选项一起使用吗? 回答: 是的,awk正则表达式可以和-f选项一起使用。通过-f选项加载一个包含正则表达式的文件,可以在awk命令中使用该文件中定义的正则表达式进行模式匹配、替换和提取文本等操作。这样可以使awk命令更加灵活和可维护。例如,可以将一组复杂的正则表达式写入一个文件,然后通过-f选项加载该文件,使得awk命令更加清晰和易于理解。 #### 引用[.reference_title] - *1* [正则表达式之awk工具用法](https://blog.csdn.net/weixin_45409403/article/details/102545317)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [9.正则表达式--awk](https://blog.csdn.net/honey_wx/article/details/120297795)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值