Linux文本处理三剑客之awk命令

2024-06-04 16:28

本文主要是介绍Linux文本处理三剑客之awk命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方文档:https://www.gnu.org/software/gawk/manual/gawk.html

什么是awk?

Awk是一种文本处理工具,它的名字是由其三位创始人(Aho、Weinberger和Kernighan)的姓氏首字母组成的。Awk的设计初衷是用于处理结构化文本数据,它提供了强大的模式匹配和数据提取功能。

Awk的工作方式是逐行扫描输入文本文件,并对每一行应用一组用户定义的规则。这些规则由模式-动作对构成,当文本行匹配某个模式时,对应的动作将被执行。Awk将输入文本自动分割成字段(默认以空格作为分隔符),可以方便地对字段进行操作和处理。

语法格式

awk 'pattern { action }' input_file
  • `pattern`是用于匹配文本行的条件。可以是正则表达式、比较表达式、逻辑表达式等。如果省略pattern,则默认匹配所有行。
  • `{ action }`是在匹配成功时执行的动作块。可以是一条或多条语句,用花括号 {} 包围。如果省略动作块,将默认执行打印整行的操作。
  • `input_file`是要处理的输入文件。如果省略此参数,则从标准输入读取数据。

常见要点

字段和字段分隔符:

  • 默认情况下,Awk将每一行分割成多个字段,字段之间以空格或制表符作为分隔符。
  • 可以使用`-F`选项指定不同的字段分隔符。例如,`-F ','`表示使用逗号作为分隔符。
  • 可以使用`$1``$2`等表示第1、第2个字段,`$0`表示整行。

内置变量:

  • `NR`表示当前处理的行数。
  • `NF`表示当前行的字段数量。
  • `FNR`表示当前文件中的行数。
  • `FILENAME`表示当前处理的文件名。

控制流语句:

  • `if-else`条件语句:根据条件执行不同的动作。
  • `for`循环语句:迭代执行一系列动作。
  • `while`循环语句:在满足条件的情况下重复执行一系列动作。
  • `do-while`循环语句:先执行一系列动作,然后根据条件重复执行。

内置函数:

Awk提供了许多内置函数,可用于字符串处理、数学运算、日期处理等。例如:`length()``substr()``tolower()``toupper()``sin()``cos()`等。

输出打印:

  • 使用`print`语句将结果输出到标准输出。可以打印文本、变量、表达式等。
  • 使用`printf`函数以格式化的方式打印输出。

示例

-- 使用Awk来统计文件中的行数:
awk '{ count++ } END { print count }' input.txt-- 使用Awk计算一个CSV文件中某一列的总和:
awk -F ',' '{ sum += $3 } END { print sum }' data-- 使用Awk从日志文件中提取特定时间段内的日志记录:
awk '/Jun 15 10:30:00/, /Jun 15 11:00:00/' access.log-- 使用Awk计算一个文本文件中每个单词的出现次数:
awk '{ for(i=1; i<=NF; i++) count[$i]++ } END { for(word in count) print word, count[word] }' text.txt-- 使用正则表达式匹配包含数字的行:
awk '/[0-9]+/' input.txt-- 计算每行字段数量,并打印行号和字段数量:
awk -F ',' '{ print "Line", NR, "has", NF, "fields" }' data.csv-- 打印文件名和行号:
awk '{ print "File:", FILENAME, "Line:", NR, $0 }' file1.txt file2.txt-- 使用`if-else`条件语句来根据条件执行不同的动作:
awk '{ if ($1 > 10) print $1, "is greater than 10"; else print $1, "is less than or equal to 10" }' data.txt-- 使用`for`循环语句打印九九乘法表:
awk 'BEGIN { for(i=1; i<=9; i++) { for(j=1; j<=i; j++) printf("%d*%d=%d ", j, i, i*j); print "" } }'-- 使用`length()`函数获取每行的字符数:
awk '{ print "Line", NR, "has", length($0), "characters" }' data.txt-- 使用`substr()`函数截取字段的子字符串:
awk -F ',' '{ print "Name:", $1, "Initials:", substr($1, 1, 1) substr($2, 1, 1) }' names.csv-- 使用`print`语句打印文本和变量:
awk '{ name = $1; age = $2; print "Name:", name, "Age:", age }' data.txt-- 使用`printf`函数以格式化的方式打印输出:
awk '{ printf "Name: %-10s Age: %2d\n", $1, $2 }' data.txt-- 删除temp文件的重复行
awk '!($0 in array) { array[$0]; print }' temp-- 查看最长使用的10个命令
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -rn | head -n 10-- 查看机器的ip列表
ifconfig -a | awk '/Bcast/{print $2}' | cut -c 5-19-- 查看机器的每个远程链接机器的连接数
netstat -antu | awk '$5 ~ /[0-9]:/{split($5, a, ":"); ips[a[1]]++} END {for (ip in ips) print ips[ip], ip | "sort -k1 -nr"}'-- 查看某个进程打开的socket数量
ps aux | grep [process] | awk '{print $2}' | xargs -I % ls /proc/%/fd | wc -l-- 批量重命名文件
find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv %s name%01d.jpg\n", $0, a++ }' | bash-- 查看某个用户打开的文件句柄列表
for x in `ps -u 500 u | grep java | awk '{ print $2 }'`;do ls /proc/$x/fd|wc -l;done-- 计算文件temp的第一列的值的和
awk '{s+=$1}END{print s}' temp-- 查找某个时间戳的文件列表
cp -p `ls -l | awk '/Apr 14/ {print $NF}'` /usr/users/backup_dir-- 格式化输出当前的进程信息
ps -ef | awk -v OFS="\n" '{ for (i=8;i<=NF;i++) line = (line ? line FS : "") $i; print NR ":", $1, $2, $7, line, ""; line = "" }'-- 查看输入数据的特定位置的单个字符
echo "abcdefg"|awk 'BEGIN {FS="''"} {print $2}'-- 打印当前的ssh客户端
netstat -tn | awk '($4 ~ /:22\s*/) && ($6 ~ /^EST/) {print substr($5, 0, index($5,":"))}'-- 打印文件第一列不同值的行
awk '!array[$1]++' file.txt-- 打印第二列唯一值
awk '{ a[$2]++ } END { for (b in a) { print b } }' file-- 查看系统所有分区
awk '{if ($NF ~ "^[a-zA-Z].*[0-9]$" && $NF !~ "c[0-9]+d[0-9]+$" && $NF !~ "^loop.*") print "/dev/"$NF}'  /proc/partitions-- 查看2到100所有质数
for num in `seq 2 100`;do if [ `factor $num|awk '{print $2}'` == $num ];then echo -n "$num ";fi done;echo-- 查看第3到第6行
awk 'NR >= 3 && NR <= 6' /path/to/file

分享、在看与点赞
只要你点,我们就是胖友

来自: Linux文本处理三剑客之awk命令icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=Mzk0NTQ3OTk3MQ==&mid=2247487424&idx=1&sn=53c4b2333d8e6e42831ad1e362040251&chksm=c315878cf4620e9abca074f1c66d97750c0587b487c51df45d41e664ceb7435ebbfe3869fae9&token=355315523&lang=zh_CN#rd

这篇关于Linux文本处理三剑客之awk命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030517

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置