前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk note

awk note

作者头像
changan
发布2020-11-04 15:01:53
7580
发布2020-11-04 15:01:53
举报
文章被收录于专栏:巡天遥看一千河

处理流程

当使用 awk 命令处理一个或者多个文件时,它会依次读取文件的每一行内容,然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容,awk 使用一对单引号来表示一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。awk 的每个花括号内同时可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。

格式: awk ‘condition action’ filename

代码语言:javascript
复制
awk -F '[|:;]' '{if ($1 > "m") print $1; else print "---"}' /etc/passwd

脚本化:

代码语言:javascript
复制
#! /bin/awk -f
BEGIN    {print "begin to awk\n"} 
$s ~ /beijing/ 
END { print "end of awk" }

# xxx.awk xxx.data

内置变量

变量

含义

$0

行内容

$1

第一列字段

NF

当前行有多少个字段

$NF

最后一个字段

NR

当前处理的是第几行

FILENAME

当前文件名

FS

字段分隔符,默认是空格和制表符。

RS

行分隔符,用于分割每一行,默认是换行符。

OFS

输出字段的分隔符,用于打印时分隔字段,默认为空格。

ORS

输出记录的分隔符,用于打印时分隔记录,默认为换行符。

OFMT

数字输出的格式,默认为%.6g。

内置函数

func

含义

tolower()

字符转为小写

length()

返回字符串长度

substr()

返回子字符串

sin()

正弦

cos()

余弦

sqrt()

平方根

rand()

随机数

组合使用

使用 awk 过滤 history 输出,找到最常用的命令

代码语言:javascript
复制
[root@centos ~]# history | awk '{a[$4]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
267 ll
122 vim
118 cd
54 awk
34 man
28 g++
23 rm
21 cat
16 mkdir
13 gcc

过滤文件中重复行

代码语言:javascript
复制
awk '!x[$0]++' <file>

假设有一个文本,每一行都是一个 int 数值,想要计算这个文件每一行的和

代码语言:javascript
复制
awk '{s+=$1} ENG {printf "%.0f", s}' /path/to/file

next

代码语言:javascript
复制
No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No    Item_Name     Price      Quantity
1     Mangoes       $3.45       5    *
2     Apples        $2.45      25
3     Pineapples    $4.45      55
4     Tomatoes      $3.45      25 
5     Onions        $1.45      15   *
6     Bananas       $3.45      30

当第一个表达式用{ printf “%s\t%s\n”, $0,”**” ; }命令进行标注的时候在同样的步骤第二个表达式也进行了判断这样就浪费了时间; 这个东西不是 if else; 而是都判断的,不判断后一个,可以

代码语言:javascript
复制
awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

REF

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 处理流程
  • 内置变量
  • 内置函数
  • 组合使用
  • next
  • REF
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档