[linux]awk 学习笔记

awk 学习笔记

最近添加了几个功能的日志,但是呢,这个日志就是输出,一般自己也发现不了问题,于是想写一些简单的监控脚本来看看日志的大致情况,

比如有没有error,每天有多少error报出来。 想到了以前运维的同时分享awk,于是想简单的学习下。

入门

最简单的输入某些列 使用$4 这种来表示 __$0__是输出整列

[root]/root/test$ps -ef|grep uwsgi|awk ‘{print $1,$5}’
root Jul24
root Jul24
root Jul24
root Jul24
root Jul24
root Jul24
root Jul24
root Jul24
root Jul24
root 18:49

格式化输出:

[root]/root/test$ps -ef|grep uwsgi|awk ‘{printf “%-2s and %-4s \n”,$1,$5}’
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and Jul24
root and 18:51

过滤
判断

判断符号 !=, >, <, >=, <=,==

[root]/root/test$ps -ef|grep uwsgi|awk ‘$2==”20596”’
root     20596 20560  0 Jul24 ?        00:00:19 uwsgi -x uwsgi.xml
#使用表头(就是取第一行) NR
[root]/root/test$ps -ef|grep uwsgi|awk ‘$2==”20596” || NR==1 {print $7}’
00:00:01
00:00:19

内建变量:

$0 —> 当前记录(这个变量中存放着整个行的内容)

$1~$n —> 当前记录的第n个字段,字段间由FS分隔

FS—> 输入字段分隔符 默认是空格或Tab

NF—> 当前记录中的字段个数,就是有多少列

NR—> 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。

FNR—> 当前记录数,与NR不同的是,这个值会是各个文件自己的行号

RS—> 输入的记录分隔符, 默认为换行符

OFS—> 输出字段分隔符, 默认也是空格

ORS—> 输出的记录分隔符,默认为换行符

FILENAME—> 当前输入文件的名字

取出特定的列并显示行号:

[root]/root/test$ps -ef|grep uwsgi|awk ‘$2==”20596” || NR==1 {printf “No %s, %s \n”,NR,$7}’
No 1, 00:00:01
No 6, 00:00:19

指定分割符:

[root]/root/test$awk  ‘BEGIN{FS=”:”} {print $1,$3,$6}’ /etc/passwd
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
#也可以写成
awk  -F: ‘{print $1,$3,$6}’ /etc/passwd

多个分隔符的写法: awk -F ‘[;:]’

使用正则

$cat test.log
2014-07-21 20:00:53,379 - charge - INFO - 30748 - contract_no=chuangfu-MIDS-1306
2014-07-21 20:00:53,406 - charge - INFO - 30748 - contract_no=chuangfu-MIDS-1306
2014-07-21 20:00:53,431 - charge - INFO - 30748 - contract_no=chuangfu-MIDS-1306
2014-07-21 20:00:53,543 - charge - INFO - 30748 - contract_no=vvvgame-CCDL-1307
2014-07-24 16:00:34,356 - charge - INFO - 18338 - contract_no=sennheiser-CC-1405
2014-07-24 16:00:34,394 - charge - INFO - 18338 - contract_no=sennheiser-CC-1405
2014-07-24 16:04:24,431 - charge - INFO - 19081 - contract_no=sennheiser-CC-1405
2014-07-24 16:04:24,479 - charge - INFO - 19081 - contract_no=sennheiser-CC-1405
2014-07-24 16:07:20,349 - charge - INFO - 19081 - contract_no=sennheiser-CC-1405
2014-07-24 16:07:20,390 - charge - INFO - 19081 - contract_no=sennheiser-CC-1405
[root]/Application/2.0/nirvana/logs$awk ‘$10 ~ /MIDS/ {print NR,$1,$2}’ test.log
1 2014-07-21 20:00:53,379
2 2014-07-21 20:00:53,406
3 2014-07-21 20:00:53,431

这里 ~是模式的开始,如果是对模式取反 使用!~, //是正则表达式

把结果放到文件中直接使用重定向就行了。

使用if else对文件分组重定向

$awk ‘{if($10 ~ /MIDS/) print > “mids.txt”;else if($6 ~ /CCDL/) print > “ccdl.txt”; else print > “cc.txt”}’ test.log

Demo
小案例

#计算log文件的大小
$ls -l *.log|awk ‘{sum+=$5} END {print sum}’
102610686
#打印99乘法表
$seq 9 | sed ‘H;g’ | awk -v RS=’‘ ‘{for(i=1;i<=NF;i++)printf(“%dx%d=%d%s”, i, NR, i*NR, i==NR?”\n”:”\t”)}’
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

怎么写脚本,后面在学习

引用

AWK简明教程

本文出自 “orangleliu笔记本” 博客,请务必保留此出处 http://blog.csdn.net/orangleliu/article/details/38357071

[linux]awk 学习笔记

时间: 2024-11-05 16:04:53

[linux]awk 学习笔记的相关文章

linux awk学习笔记

awk学习笔记 awk语法格式 awk '{pattern + action}' {filenames} awk作用 awk的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文件操作.完整的awk脚本通常用来格式化文本文件中的信息. 通常,awk是以文件的一行为处理单位的.awk每接收文件的一行,再执行相应的命令,来处理文本.

Linux 操作系统学习笔记

一,unix 1.unix 特点 伸缩性强,开放性好, 2.基本原则 所有对象,硬件都是文件 配置数据以文本形式保存 短小的单目的程序构成 多个程序合作完成复杂任务 3.gnu 基本原则是共享,建立自由开放的unix系统 1984年 richard stallman 发起 基本体系是micro kernel 4.gpl Copyleft 原作者所有权 5.linux起源 Linustorvalds, 自由的类unix操作系统, 遵循gnu和gpl 6.linux 可以实现unix功能 遵循开源许

awk学习笔记【转】

Awk学习笔记 整理:Jims of 肥肥世家 <[email protected]> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2004年8月6日 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2. 操作 4. awk的环境变量 5. awk运算符 6. 记录和域 6.1. 记录 6.2. 域 6.3. 域分隔符

Linux命令学习笔记目录

Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 2.linux命令学习笔记(2):cd命令 3.linux命令学习笔记(3):pwd命令 4.linux命令学习笔记(4):mkdir命令 5.linux命令学习笔记(5):rm 命令 6.linux命令学习笔记(6):rmdir 命令 7.linux命令学习笔记(7):mv命令 8.linux命

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

Linux 程序设计学习笔记----POSIX 文件及目录管理

转载请注明:http://blog.csdn.net/suool/article/details/38141047 问题引入 文件流和文件描述符的区别 上节讲到ANSI C 库函数的实现在用户态,流的相应资源也在用户空间,但无论如何实现最终都需要通过内核实现对文件的读写控制.因此fopen函数必然调用了对OS的系统调用.这一调用在LINUX下即为open, close, read, write等函数.这些都遵循POSIX标准. so,在linux系统中是如何通过POSIX标准实现对文件的操作和目

Linux程序设计学习笔记----System V进程间通信(信号量)

关于System V Unix System V,是Unix操作系统众多版本中的一支.它最初由AT&T开发,在1983年第一次发布,因此也被称为AT&T System V.一共发行了4个System V的主要版本:版本1.2.3和4.System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如"SysV 初始化脚本"(/etc/init.d),用来控制系统启动和关闭,System V Interface Definitio