linux编程之awk

gawk是由GNU组织改良后的awk,这种语言在linux操作系统上,有着很好的应用,它不需要编译,比其它语言更为简洁,而且效率极高,还能与shell进行交互,是运维人员必不可少的编辑三剑客之一

gawk是一种报告生成器,它将文本读入内存,然后,结符合的显示在屏幕上

gawk的基本语法:

gawk [options] ‘program‘ file file …

gawk [options] ‘PATTERN{action}‘file file…

1、gawk的输出,使用print和printf

注意:

a、各个项目之间用逗号分隔,输出时使用输出分隔符

b、输出的各item可以为字符串、数值、当前记录的字段、变量、gawk的表达式

数值会被隐式转换为字符串后输出。

c、如果print后面的item省略,相当于print $0;输出空白使用print""

printf:

命令的使用格式:printf format,item1,item2,…

注意:

a、一定要指定format

b、输出时,不会自动换行,需要加入\n

c、format用于为每个item输出指定的格式

format的指示符以%开头,后跟一个修饰符

%c:显示字符的ASCII符

%d,%i:十进制的整数

%e,%E:科学技术法显示数值

%f:显示浮点数

%s:显示字符串

%u:显示无符号整数

%%:这是一个转义,相当于%自身

修饰符

#:显示宽度,是一个数值

-:左对齐显示

+:显示数值的符号

.#:取数值的精度

gawk的内置变量:

FS:输入时的字段分隔符

RS:输入是的行分隔符

OFS:输出时的字段分隔符

ORS:输出时的行分隔符

NF:显示字段数

NR:显示文件的行数,如果多个文件,一并线束

FNR:对NR的补充,分别对每个文件分别计数

ARVG:数组,保存命令的本身

实例:

gawk ‘{print $0}‘ file1 file2

ARGV[0]:gawk

ARGV[1]:file1

ARGC:保存gawk命令中参数的个数

上面的参数为3

FILENAME:gawk正在处理的文件的名称

这里是file1和file2

############################################

自定义变量

-v VAR_NAME=VALUE

变量名区分字符大小写

可以再program中定义;或是在命令行中定义

实例:

[[email protected] tmp]# gawk -v test="hello linux" ‘{print test}‘ /etc/issue

[[email protected] tmp]# gawk ‘{test="hello linux";print test}‘ /etc/issue

这里的issue只是为了提供遍历的次数

##########################################

gawk的输出重定向:

print items > output_file

print items >> output_file

print items | command

特殊的文件描述符

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

实例:

将uid大于500的用户输出到common文件中

[[email protected] tmp]# gawk -F: ‘$3>=500{print}‘ /etc/passwd > common_user

[[email protected] tmp]# gawk ‘BEGIN {"date" | getline d; print d}‘

#########################################

gawk的操作符:

算术操作符

x+y:相加

x-y:相减

x*y:相乘

x/y:相除

x**y,x^y:幂运算

x%y:取模运算

-x:负值

+x:转换为数值

字符串操作符:连接

负值操作符

=

+=

-=

*=

/=

%=

^=,**=

++

注意:如果模式自身为=号,则要写成/=/

比较操作符

<

<=

>

>=

==

!=

~:模式匹配,左边的字符串若是能被右边的模式所匹配,则为真,否则为假

!~:与上面相反,表示不能匹配

逻辑操作符

&&:相与

||:相或

条件表达式

selector?if-true-expression:if-false-express

实例:

# awk -F: ‘{$3>=500?utype="common user":utype="admin or system user";print $1,"is",utype}‘

/etc/passwd

模式:

1、格式为/PATTERN/

仅处理被/PATTERN/匹配到的行

2、表达式,其结果为非0或非空字符串时

仅处理满足条件的行

3、行范围,地址定界,start_line,stop_line

仅处理范围的行

4、BEGIN/END,特殊模式,运行在program之前或是之后

控制语句

if-else:

格式:if (condition) (then body) else (else body)

实例:将/etc/inittab文件下,大于8个字段的都显示处理

[[email protected] ~]# gawk ‘{if (NF>=8) print}‘ /etc/inittab

while:

格式:while (condition) {while body}

[[email protected] ~]# gawk ‘{test=1;while (test<=NF) {if (length($test)>=5)

{print $test};test++ }}‘ /etc/inittab

for:

格式:for (variable assignment;condition;itenration process) {for body}

[[email protected] ~]# gawk ‘{for (i=1;i<=NF;i+=2){printf "%s",$i};print ""}‘ /etc/passwd

next:提前结束对本行的处理,进而进入下一行的处理

显示奇数行的用户名,如果有多个文件时,使用FNR

[[email protected] ~]# gawk -F: ‘{if (NR%2==0) next; print NR,$1}‘ /etc/passwd

gawk的内置函数

split:切割

格式:split(string,array[,fieldsep[,seps]])

功能:将string表示的字符串以fieldsep为分隔符进行切片,结果保存在array数组中

数组下表从1开始

实例:用gawk取出当前的时间,hh:mm:ss

[[email protected] ~]# date | gawk ‘{split($0,arr," ");print arr[4]}‘

length字符串的长度

[[email protected] ~]# echo "hello world" | gawk ‘{print length}‘

substr:

格式:substr(string,start[,length])

功能:从string中取子串,从start为起始位置为取length长度的子串

实例

[[email protected] ~]# echo "hello world" | gawk ‘{print (substr($0,7))}‘

[[email protected] ~]# echo "hello world" | gawk ‘{print (substr($0,2,4))}‘

时间: 2024-10-06 09:21:21

linux编程之awk的相关文章

Linux编程之ICMP洪水攻击

我的上一篇文章<Linux编程之PING的实现>里使用ICMP协议实现了PING的程序,ICMP除了实现这么一个PING程序,还有哪些不为人知或者好玩的用途?这里我将介绍ICMP另一个很有名的黑科技:ICMP洪水攻击. ICMP洪水攻击属于大名鼎鼎的DOS(Denial of Service)攻击的一种,一种是黑客们喜欢的攻击手段,这里本着加深自己对ICMP的理解的目的,也试着基于ICMP写一段ICMP的洪水攻击小程序. 洪水攻击(FLOOD ATTACK)指的是利用计算机网络技术向目的主机发

Linux编程之UDP SOCKET全攻略

这篇文章将对linux下udp socket编程重要知识点进行总结,无论是开发人员应知应会的,还是说udp socket的一些偏僻知识点,本文都会讲到.尽可能做到,读了一篇文章之后,大家对udp socket有一个比较全面的认识.本文分为两个专题,第一个是常用的upd socket框架,第二个是一些udp socket并不常用但又相当重要的知识点. 一.基本的udp socket编程 1. UDP编程框架要使用UDP协议进行程序开发,我们必须首先得理解什么是什么是UDP?这里简单概括一下. UD

【转】 linux编程之GDB调试

GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来 3 单步执行 4 运行时修改变量的值 5 跟踪路径 6 线程切换 等等 下面以以下程序为例 当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下: GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调

shell编程之awk

GNU awk AWK:Aho,Weinberger,Kernighan GNU awk --> gawk#ll `which awk`    /usr/bin/awk -> gawk 报表生成器,格式化文本输出; #man awk    pattern scanning and processing language.    模式扫描和处理语言;    基本用法:    awk [option] 'program' file        program: PATTERN{ACTION ST

我的linux编程之路01

我的linux编程之路从现在开始!

Linux编程之PING的实现

void icmp_pack(struct icmp* icmphdr, int seq, int length) { int i = 0; icmphdr->icmp_type = ICMP_ECHO; //类型填回送请求 icmphdr->icmp_code = 0; icmphdr->icmp_cksum = 0; //注意,这里先填写0,很重要! icmphdr->icmp_seq = seq; //这里的序列号我们填1,2,3,4.... icmphdr->icmp

Linux编程之Makefile(一)

我刚开始学Linux的时候,并没有用Makefile.写一个test.c ,然后直接gcc -o -g test test.c.后来文件一多,各种.c .h 文件.原来的方法是没法编译的.所以这时候就要靠Makefile. 先写一个简单的例子吧.现在有一段代码 #include<stdio.h> int main(int args,char *argv[]) { printf("hello,world!!"); return 0; } 稍微插一段编译原理:首先你的.c到Li

linux编程之getopt

getopt -- 解析命令的可选项 [说明]getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,格式如下: 1.形如:cmd [-a][-b] //对短选项的解析: 2.形如:cmd [-a a_argument][-b b_argument] //对短选项及短选项的参数解析: 3.形如:cmd [-a[a_argument]] //选项a的参数也是可选的情况解析 原型: #include <unistd.h> extern char *optarg; extern

Linux编程之recvmsg和sendmsg函数

recvmsg 和 sendmsg 函数 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_