`
zhang_xzhi_xjtu
  • 浏览: 535063 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

linux awk简明笔记

阅读更多
awk是一个简单强大的文本过滤报告工具。

简介

其基本结构为 pattern { action }

awk是一个面向行的编程工具。pattern定义了怎么匹配一个行,action定义了匹配成功的动作。默认为所有的行都匹配,BEGIN 和 END 关键字,一个在所有行处理之前执行,一个在所有行处理之后执行。

awk把每一行看作一些field,$0代表整行,$1代表第一个field,等等。

和很多脚本语言不一样的是,$number不代表一个变量,而是一个field。
也不对""之中的符号进行特别解释。

换行不能乱用,可以
{ action1 }
{ action2 }

awk中有3种常量,字符串,数字,正则表达式。
数字和字符串的转换:
字符串转数字,贪婪算法转该字符串的顶头子字符串,如果不行为0。
数字转字符串,CONVFMT控制。整数不受CONVFMT控制。

awk的底层类型有两种,数字,字符串,一个变量可以既是数字,又是字符串,底层保有2个值。原因嘛,效率,精度。

运算符



比较的时候,使用的是最后赋值的类型,而不是最后使用的类型。
对于不确定类型(如传入参数,域)等,能数字比较的数字比较,不能的话变为字符串比较。


和c一脉相传的东西(很相似)

运算符
二元 + - * / % <space>  <space>为字符串连接操作符。
一元 +(正号)  -(负号)
自增运算符 ++ --
+= -= *= /= %=
=(赋值运算符) ()可以明确运算符的优先级。

逻辑符
== != > >= < <=

&& || !

检查一个字符串是否匹配
!~ /正则表达式/ 不匹配正则表达式
~ /正则表达式/ 匹配正则表达式

命令
if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
for ( variable in array ) statement
break
continue
{ [ statement ] ...}
variable=expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
next  这个挺好用的,跳出当前处理的行。
exit   这个和一般的exit不同,跳过所有的行,但是会执行END。





内置常量

FS - The Input Field Separator Variable

用-F可以指定分隔符。FS是build in的分隔符变量。

经典例子
行为 One Two:Three:4 Five
{
	print $2
	FS=":"
	print $2
}

输出 Two:Three:4 Five两次。
防止side-effect,FS的设置在read line之后有效,在一次read line之中变量不会改变,可以消除很多bug。

OFS - The Output Field Separator Variable
NF - The Number of Fields Variable
NR - The Number of Records Variable
RS - The Record Separator Variable
ORS - The Output Record Separator Variable
FILENAME - The Current Filename Variable




Associative Arrays
Instead of using a number to find an entry in an array, use anything you want.
关联数组的key全部都是string。

直接引用数组中不存在的key会创建一个pair。
用 key in array 可以测试该数组是否有一个key的pair并且不创建pair。

delete:删除元素。

BEGIN {
	username[""]=0;
}
{
	username[$3]++;
}
END {
	for (i in username) {
		if (i != "") {
			print username[i], i;
		}
	}
}


Multi-dimensional Arrays
a[1,2] = y; 这个不行。
a[1 "," 2] = y; 记住,<space>是字符串连接。

Example of using AWK's Associative Arrays
1 记住初始化一个值。
2 好的变量命名。
3 确保输入正确。
4 给每一个field起一个好名字。
5 一遍遍历,得到所有东西。

一个好例子,值得好好研究,用户,组,文件所占空间大小检测程序。
#!/bin/sh
find . -type f -print | xargs /usr/bin/ls -islg | 
awk '
BEGIN {
# initialize all arrays used in for loop
	u_count[""]=0;
	g_count[""]=0;
	ug_count[""]=0;
	all_count[""]=0;
}
{
# validate your input
        if (NF != 11) {
#	ignore
	} else {
# assign field names
		inode=$1;
		size=$2;
		linkcount=$4;
		user=$5;
		group=$6; 

# should I count this file?

		doit=0;
		if (linkcount == 1) {
# only one copy - count it
			doit++;
		} else {
# a hard link - only count first one
			seen[inode]++;
			if (seen[inode] == 1) {
				doit++;
			}
		}
# if doit is true, then count the file
		if (doit ) {

# total up counts in one pass
# use description array names
# use array index that unifies the arrays

# first the counts for the number of files

			u_count[user " *"]++;
			g_count["* " group]++;
			ug_count[user " " group]++;
			all_count["* *"]++;

# then the total disk space used

			u_size[user " *"]+=size;
			g_size["* " group]+=size;
			ug_size[user " " group]+=size;
			all_size["* *"]+=size;
		}
        }
}
END {
# output in a form that can be sorted
        for (i in u_count) {
				if (i != "") {
        	        print u_size[i], u_count[i], i;
				}
        }
        for (i in g_count) {
				if (i != "") {
        	        print g_size[i], g_count[i], i;
				}
        }
        for (i in ug_count) {
				if (i != "") {
        	        print ug_size[i], ug_count[i], i;
				}
        }
        for (i in all_count) {
				if (i != "") {
        	        print all_size[i], all_count[i], i;
				}
        }
} ' | 
# numeric sort - biggest numbers first
# sort fields 0 and 1 first (sort starts with 0)
# followed by dictionary sort on fields 2 + 3
sort +0nr -2 +2d | 
# add header
(echo "size count user group";cat -) |
# convert space to tab - makes it nice output
# the second set of quotes contains a single tab character
tr ' ' '	' 
# done - I hope you like it





note
note:虽然是脚本,但是防错,注释,明确初始值等等好的脚本编程习惯还是挺有用的。
分享到:
评论

相关推荐

    linux awk学习笔记

    Linux中的`awk`是一个强大的文本分析工具,由Alfred Aho、Brian Kernighan和Peter Weinberger三位开发者创建,因此得名。`awk`的主要功能是处理文本和数据,通过匹配特定模式对文件中的行进行操作。在Linux系统中,...

    最牛逼的Linux awk命令详细介绍和实例快速学习

    最牛逼的Linux awk命令详细介绍和实例快速学习

    linux下AWK学习笔记

    AWK是一种强大的文本分析工具,尤其在Linux和Unix环境下被广泛使用。它能够对文本文件中的数据行进行处理,提取、分析或者转换数据,非常适合数据分析和报告生成。本笔记将详细介绍AWK的基本概念、语法、命令选项...

    Linuxawk命令详解[归类].pdf

    Linux awk 命令详解 Linux awk 命令是 Unix 环境中的一种功能强大的文本处理工具,由 Bell Labs 的 Alfred Aho、Peter Weinberger 和 Brian Kernighan 于 1977 年开发。awk 命令的主要功能是从文件或字符串中基于...

    Awk简明教程

    ### Awk简明教程 #### 一、Awk简介与背景 Awk 是一款功能强大的文本处理工具,最初由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在 1977 年开发,用于 Unix 系统。名字来源于这三位创始人的姓氏首字母。...

    Linux实战awk详解

    Linux实战awk详解主要聚焦在如何利用awk这一强大的命令行工具处理文本流问题。Awk是Linux/unix系统中用于处理结构化文本数据的强大工具,它能够解析、处理和格式化文本,尤其在日志分析、数据提取和报表生成等方面...

    Linux学习笔记【博文整理系列】

    Linux笔记——命令:awk Linux笔记——命令:sed Linux笔记——命令:grep Linux笔记——命令:find Linux笔记——命令:Sort,uniq,join,cut,paste,split Linux笔记——shell基础:变量&本地变量&位置变量&特定变量...

    linux awk 命令大全

    Linux中的`awk`命令是一个强大的文本分析工具,它允许用户基于特定的模式匹配对文本文件进行处理。在本文中,我们将深入探讨`awk`的基本概念、语法和常见用途。 首先,`awk`有三个主要版本:`awk`、`nawk`和`gawk`...

    linux awk学习

    ### Linux Awk 学习知识点详解 #### 一、Awk 简介与基本用法 Awk 是一种在 Unix 和类 Unix 操作系统上广泛使用的文本处理工具,能够帮助用户快速处理文本数据,执行复杂的文本分析任务。Awk 的主要功能包括模式...

    linux_awk 学习手册

    【Linux Awk 学习手册】 awk 是一个强大的文本分析工具,源于 UNIX 系统,由 Aho、Weinberg 和 Kernighan 三位开发者命名。它的全名并不表示特定的功能,而是创建者姓名的首字母缩写。awk 的主要功能在于对文本数据...

    sed和awk简明手册

    ### sed和awk简明手册知识点总结 #### 一、sed简介 - **基本概念**: - sed(stream editor)是一种非交互式的面向字符流的编辑器,它主要用于文本文件的处理,尤其适用于批量替换、删除、添加等操作。 - sed的...

    linux awk详解awk详解awk详解awk详解

    Linux awk 详解 awk 是一种功能强大的程序语言,主要用于处理文档资料。它的名称来自三个最初设计者的姓氏的第一个字母:Alfred V. Aho、Peter J. We i n b e rg e r 和 Brian W.Kernighan。awk 最初在 1977 年完成...

    awk实用程序源码.zip_awk源码_linux_linux awk 源码_makefile_实用程序

    在Linux系统中,`awk`被广泛用于数据提取、格式转换和报告生成等任务。这个压缩包`awk实用程序源码.zip`包含了`awk`的源码,这对于深入理解其工作原理和学习如何编写自己的`awk`程序非常有帮助。 首先,让我们来看...

    AWK学习笔记.doc

    本笔记主要涵盖了AWK的基础知识和高级特性,旨在帮助读者理解和掌握这一实用工具。 **一.1 什么是AWK?** AWK是由Aho、Weinberger和Kernighan三位计算机科学家开发的,它的名字就是由他们的姓氏首字母组成的。AWK是...

    Linux_awk命令详解

    Linux中的awk命令是一个强大的文本分析工具,用于处理和解析文件中的数据。awk的名称来源于它的创始人: Alfred V. Aho, Peter J. Weinberger, 和 Brian W. Kernighan。awk有三个主要版本:awk、nawk(new awk)和...

    linux-awklinux-awk

    ### Linux Awk 学习指南 #### 1. Awk 简介 Awk 是一种专门设计用于处理文本和数据的编程语言,主要用于 Linux/Unix 操作系统中。它可以处理来自标准输入、一个或多个文件,甚至是其他命令的输出结果。Awk 支持高级...

    Linux AWK 命令

    Linux中的AWK命令是一个强大的文本分析工具,它允许用户在数据流中进行模式匹配和处理。这个命令的名字来源于它的三位创始人—— Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的首字母缩写。在Linux...

    Linux awk 命令用法详解

    Linux awk 命令 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项参数]...

Global site tag (gtag.js) - Google Analytics