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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目雅景临居---模块1 支付功能

一、查询全部支付方式列表 由于数据库中所有表均采用逻辑删除策略&#xff0c;所以查询数据时均需要增加过滤条件is_deleted0。 上述操作虽不难实现&#xff0c;但是每个查询接口都要考虑到&#xff0c;也显得有些繁琐。为简化上述操作&#xff0c;可以使用Mybatis-Plus提供的…

漏洞发现协议代理池GobyAWVSXray

Awvs漏扫-Sadedog-白名单-内置 加入白名单扫描&#xff0c;防Safedog拉黑IP Awws漏扫-BT&Aliyun-代理池-内置 Xray漏扫-BT&Aliyun-Proxifier-.进程 proxifier添加代理服务器 Goby漏扫-BT&Aliyun-Socket5-内置 对于不通过https对网站或操作系统进行信息收集的程…

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂&#xff0c;还通过其强大的扩展库支持丰富的后期处理效果&#xff0c;为3D场景增添无限魅力。本篇文章将引导您深入了…

探索煤化工厂巡检机器人的功能、应用及前景

大家都知道、煤化工厂是以煤为原料生产化工产品的工厂&#xff0c;存在易燃易爆、高温、中毒等隐患等。因此&#xff0c;对煤化工厂进行巡检是非常必要的。巡检旨在是定时对厂内设备运行异常、泄漏等问题&#xff0c;并及时进行处理&#xff0c;保障工作场所的安全。除了以上存…

爬虫 -- 使用selenium和scrapy爬取BBC、NYTimes、Snopes等网站的内容

源代码&#xff1a;GitHub - QQQQQQBY/CrawlNYTimes: 使用scrapy爬虫爬取纽约时报、BBC、Snopes等网站数据 目录 架构组成 scrapy.cfg items.py middlewares.py pipelines.py settings.py spiders/nytimes.py main.py 架构组成 文件结构&#xff1a; myproject/main…

统计信号处理-匹配滤波器实现与验证(matlab仿真)

什么是匹配滤波器 匹配滤波器是一种信号处理技术&#xff0c;它用于从噪声中提取信号&#xff0c;特别是在信号与噪声比率较低的情况下。匹配滤波器之所以存在&#xff0c;是因为它在信号检测和估计方面具有几个关键的优势&#xff1a; 最大化信噪比&#xff1a;匹配滤波器设计…

RestTemplate --学习笔记

什么是RestTemplate&#xff1f; 想象一下你在一家快餐店点餐。你告诉服务员你想要的食物&#xff0c;服务员在系统中输入你的订单&#xff0c;然后厨房根据这个订单做餐。等待一会儿后&#xff0c;你拿到你的食物&#xff0c;整个过程既直接又高效。 在 Java 的世界里&#…

2024年,盘点国内数字人十大品牌!

出炉了&#xff0c;2024年&#xff0c;国内数字人十大品牌。根据用户的广泛认可度和应用普及多个维度产生的报告。 2024年&#xff0c;国内数字人十大品牌分别有腾讯智影、科大讯飞、商汤数字人、硅基数字人、灰豚AI数字人、奇妙元数字人、有道数字人、万兴播报、元分身、华为…

Elasticsearch reindex用管道转换类型

es环境 Elasticsearch 7.1x 使用方法 将通过 convert processor 实现 index准备 POST index_src_1/_doc/1 {"id":"111111","author": "zlh" }GET index_src_1/_search查询得到字符串id "_source" : {"id" : …

前端实现分页

在Vue.js中&#xff0c;可以通过使用v-for指令来遍历数据并渲染分页组件。同时&#xff0c;可以使用计算属性来处理分页逻辑&#xff0c;例如计算总页数、当前页码等。 下面是一个简单的示例&#xff0c;展示了如何在Vue.js中实现分页&#xff1a; <template><div&g…

SpringCloud微服务远程接口调用

一、概念 使用springcloud将项目拆分成一个一个微服务之后&#xff0c;微服务之间的接口调用就需要通过远程的方式实现&#xff0c;这里将介绍springcloud提供的两个微服务组件来介绍如何进行微服务间的远程接口调用。 1、使用RestTEmplate LoadBalanced来实现远程接口调用及…

Linux系统--Nacos的安装

Nacos&#xff1a;更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 随着云计算技术的不断发展&#xff0c;越来越多的企业开始将业务迁移到云端。在这个背景下&#xff0c;云原生应用的开发变得越来越重要。为了帮助企业更好地构建云原生应用&#xff0c;本文将…

React useCallback用法

useCallback 是 React 中的一个 Hook&#xff0c;它用于优化性能&#xff0c;通过缓存函数的引用来避免在组件的每次渲染时都创建新的函数实例。这对于避免不必要的子组件重新渲染特别有用&#xff0c;因为如果传递给子组件的回调函数在每次渲染时都不同&#xff0c;即使子组件…

面试题:讲讲你对闭包的理解?有什么优缺点

面试题&#xff1a;讲讲你对闭包的理解&#xff1f;有什么优缺点&#xff1f; 对闭包的理解 从 JS 作用域链的角度出发&#xff0c;函数外部无法访问到函数中的变量&#xff0c;但函数内部可以访问到其外部的变量。所谓闭包&#xff08;closure&#xff09;&#xff0c;是一种…

Qt 中QList、QListIterator 、QMutableListIterator、QMap用法

#include <QCoreApplication> #include <QDebug>//QListIterator void printList() {QList<int> list;list<<1<<2<<3<<4<<5;QListIterator<int> i(list);qDebug()<<"正序打印....";//正序打印for(;i.ha…

jsonl - JSON Lines

文章目录 一、关于 JSON Lines1.UTF-8编码2.每一行都是有效的JSON值3.行分隔符为\n 4.建议的惯例 二、示例1、Better than CSV2、Easy Nested Data 三、Json 相关工具应用 一、关于 JSON Lines 官网&#xff1a;https://jsonlines.org &#xff08;下文翻译自此&#xff09;js…

如何利用Web Components提高前端开发效率?

Web Components 是一种用于构建可复用的可扩展组件的技术。它为前端开发提供了一种模块化的方法&#xff0c;可以提高开发效率。下面是一些利用 Web Components 提高前端开发效率的方法&#xff1a; 代码重用&#xff1a;Web Components 可以创建可独立使用的组件&#xff0c;这…

别再emo了,还不赶紧去考PMP,搞钱要紧~

自从疫情之后经济大不如从前&#xff0c;现在大环境都不好&#xff0c;很多公司都在裁员&#xff0c;像我朋友就在上个月被裁掉了&#xff0c;虽说拿了补偿但也不可能靠那点补偿生活的&#xff0c;所以我朋友找了很久的工作&#xff0c;但是由于大环境的缺失所以导致他的薪资直…

搭建 3D 智慧农场可视化

运用图扑自主研发的 HT 产品&#xff0c;全程零代码搭建 3D 轻量化 Low Poly 风格的智慧农场可视化解决方案&#xff0c;无缝融合 2D、3D 技术&#xff0c;1&#xff1a;1 还原农场的区域规划&#xff0c;展开对农作物间的网格化管理。

js控制并发请求的最优解和js控制调用频率,大量请求延迟执行

js控制并发请求的最优解 思路&#xff1a;维护一个运行池&#xff0c;一个等待队列&#xff0c;出一个进一个&#xff0c;控制运行池的大小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv&q…