awk最简单明了入门方法

Awk,sed,grep三剑客

Grep合适单纯的查找或者匹配文本

Sed合适编辑匹配到的文本

Awk更合适格式化,对文本进行比较复杂的处理

Awk语法 awk [options] ‘program’ file1,file2........

# awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern):

一般使用关系表达式作为条件

x > 10 判断变量 x是否大于10

x>=10 大于等于

x<=10 小于等于

动作(Action):

格式化输出

流程控制语句

Awk基本了解篇

1先从简单的一个打印动作来初步了解awk

创建测试数据

[[email protected] tmp]# echo test >testd

[[email protected] tmp]# cat testd

test

[[email protected] tmp]# awk ‘{print}‘ testd

Test

场景2

[[email protected] tmp]# df

Filesystem     1K-blocks    Used Available Use% Mounted on

/dev/sda3       18375548 3566396  13875728  21% /

tmpfs             502204       0    502204   0% /dev/shm

/dev/sda1         198337   29662    158435  16% /boot

打印第五列

[[email protected] tmp]# df |awk ‘{print $5}‘

Use%

21%

0%

16%

一次打印多列,打印第一列和第五列

[[email protected] tmp]# df |awk ‘{print $1,$5}‘

Filesystem Use%

/dev/sda3 21%

tmpfs 0%

/dev/sda1 16%

[[email protected] tmp]# df |grep "sda3" |awk ‘{print $1,$5}‘

/dev/sda3 21%

除了输出文本中的列,还可以加入自己的字段,将自己的字段和文件中的列结合起来,如

[[email protected] tmp]# cat >>testd <<eof

> lixunhuan

> afei

> shangguangjinghong

> wangliqin

> eof

[[email protected] tmp]# awk ‘{print $1,"welcome"}‘ testd

test welcome

lixunhuan welcome

afei welcome

shangguangjinghong welcome

wangliqin welcome

[[email protected] tmp]# cat testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

[[email protected] tmp]# awk ‘{print "name:" $1,"socer:" $2}‘ testd

name:test socer:98

name:lixunhuan socer:100

name:afei socer:95

name:shangguangjinghong socer:86

name:wangliqin socer:100

输出整行两种方法,一是$0  ,而是什么都不加

[[email protected] tmp]# cat testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

[[email protected] tmp]# awk ‘{print}‘ testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

[[email protected] tmp]# awk ‘{print $0}‘ testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

Awk是逐行处理的,刚才已经演示了最常用的动作print,

介绍一下特殊模式begin和end

Begin模式指定了处理文本之前所需要执行的操作

End模式指定了处理完所有行之后所需要执行的操作

[[email protected] tmp]# cat testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

[[email protected] tmp]# awk ‘BEGIN {print "aa","bb"}‘ testd

aa bb

[[email protected] tmp]# awk ‘BEGIN {print "aa","bb"}‘

aa bb

经过试验发现,我们不需要输入任何文件来源,awk就直接输出信息了,因为begin模式表示,在处理指定文本之前,需要先执行begin模式中的指定操作,而上述试验我只是让他做出打印输出,这时候如果我们想要先执行begin之前的作用之外,再执行我们我们自定义执行的动作去操作文本,例如

[[email protected] tmp]# cat testd

test    98

lixunhuan       100

afei    95

shangguangjinghong      86

wangliqin       100

[[email protected] tmp]# awk ‘BEGIN{print "aa","bb"} {print $1,$2}‘ testd

aa bb

test 98

lixunhuan 100

afei 95

shangguangjinghong 86

wangliqin 100

End模式就是在处理完所有指定的文本后,需要执行的作用,通常我们可以结合begin和end模式一起使用

[[email protected] tmp]# awk ‘BEGIN{print "aa","bb"}{print $1,$2} END {print "cc","dd"}‘ testd

aa bb

test 98

lixunhuan 100

afei 95

shangguangjinghong 86

wangliqin 100

cc dd

返回结果中有没有那种表头,表内容,表尾的那种感觉,这就是awk对文本格式化的能力

 

Awk分隔符  

Awk默认分隔符是空格,但是这样描述并不十分准确,awk的分隔符分为两种,输出分隔符和输入分隔符

输入分隔符:默认是空白字符(空格),默认是以空格为分隔符对每一行进行分隔,我们可以指定我们想要的分隔符来分隔  参数-F

[[email protected] tmp]# cat >>test <<eof

> abc##luliechu##iuy#dd

> 8u#liusheng#li#32

> eof

[[email protected] tmp]# cat test

abc##luliechu##iuy#dd

8u#liusheng#li#32

[[email protected] tmp]# awk -F# ‘{print $1,$2,$3}‘ test

abc  luliechu

8u liusheng li

还可以设置内置变量FS来指定分隔符,需要使用-V选项 ,如 -v FS=’#’

[[email protected] tmp]# cat test

abc##luliechu##iuy#dd

8u#liusheng#li#32

[[email protected] tmp]# awk -F# ‘{print $1,$2,$3}‘ test

abc  luliechu

8u liusheng li

[[email protected] tmp]# ^C

[[email protected] tmp]# awk -v FS=‘#‘ ‘{print $1,$2,$3}‘ test

abc  luliechu

8u liusheng li

可以看出效果是一样的

输出分隔符:当我们要对处理完的文本进行输出的时候,以什么文本或符号作为分隔符

默认是空白字符(空格),我们可以用内置变量OFS来设定awk的输出分隔符,使用变量的时候都需要配合使用-v选项

[[email protected] tmp]# ls

public  test  test1.txt  test2.txt  test3.txt  test4.txt  test5.txt  testd

[[email protected] tmp]# rm -f test test{1..5}.txt

[[email protected] tmp]# ls

public  testd

[[email protected] tmp]# cat >>test <<eof

> luliechu 123

> lixunhuan 145

> afei 98

> eof

[[email protected] tmp]# awk -v OFS="+" ‘{print $1,$2}‘ test

luliechu+123

lixunhuan+145

afei+98

同时指定输入分隔符合输出分隔符

[[email protected] tmp]# cat >>test <<eof

> luliechu#123

> lixuhuan#150

> eof

[[email protected] tmp]# awk -v FS="#" -v OFS=‘成绩=‘ ‘{print $1,$2}‘ test

luliechu成绩=123

lixuhuan成绩=150

在输出的时候合并一起显示,将两列合并显示

[[email protected] tmp]# awk ‘{print $1$2}‘ test

luliechu#123

lixuhuan#150

Awk变量

Awk变量分为自定义变量和内置变量

常见自定义变量以及作用如下

FS 输出分隔符

OFS 输入分隔符

ORS 输出换行符

NF 当前行的字段的个数(当前行被分隔成了多少列)

NR 行号

FNR 各文件分别计数的行号

FILENAME 当前文件名

ARGC 命令行参数的个数

ARGV 数组

NR实例

[[email protected] tmp]# cat test

luliechu 123

lixunhuan 145

afei 98

luliechu#123

lixuhuan#150

[[email protected] tmp]# awk ‘{print NR}‘ test

1

2

3

4

5

NF实例   显示每一行的行号以及每一行对应有多少列

[[email protected] tmp]# cat test

luliechu 123

lixunhuan 145

afei 98

luliechu#123

lixuhuan#150

[[email protected] tmp]# awk ‘{print NR}‘ test

1

2

3

4

5

[[email protected] tmp]# awk ‘{print NR,NF}‘ test

1 2

2 2

3 2

4 1

5 1

添加行号输出

[[email protected] tmp]# awk ‘{print NR,$0}‘ test

1 luliechu 123

2 lixunhuan 145

3 afei 98

4 luliechu#123

5 lixuhuan#150

如果我们同时处理多个文件时候行号显示

[[email protected] tmp]# awk ‘{print NR,$0}‘ test test1

1 luliechu 123

2 lixunhuan 145

3 afei 98

4 luliechu#123

5 lixuhuan#150

6 昔在九江上

7 遥望九华峰

8 天河挂绿水

9 秀出九芙蓉

10 我欲一挥手

11 谁人可想从

从返回结果可以看出,如果使用NR显示行号,那么多个文件的所有行会按照顺序进行排序,如果我们要分别显示两个文件的行号,就需要用到内置变量FNR

[[email protected] tmp]# awk ‘{print FNR,$0}‘ test test1

1 luliechu 123

2 lixunhuan 145

3 afei 98

4 luliechu#123

5 lixuhuan#150

1 昔在九江上

2 遥望九华峰

3 天河挂绿水

4 秀出九芙蓉

5 我欲一挥手

6 谁人可想从

输入行分隔符RS,默认是回车换行

假入我想让他认为每次遇到一个#就换行

[[email protected] tmp]# cat test

luliechu 123

lixunhuan 145

afei 98

luliechu#123

lixuhuan#150

[[email protected] tmp]# sed -n 1,3d test

[[email protected] tmp]# sed -i 1,3d test

[[email protected] tmp]# cat test

luliechu#123

lixuhuan#150

[[email protected] tmp]# awk -v RS="#" ‘{print NR,$0}‘ test

1 luliechu

2 123

lixuhuan

3 150

输出行分隔符,也就是在它为我们换行后会加上我们需要的标识,默认是回车,是没有任何标识的

[[email protected] tmp]# cat test

luliechu#123

lixuhuan#150

[[email protected] tmp]# awk -v ORS="+" ‘{print NR,$0}‘ test

1 luliechu#123+2 lixuhuan#150+[[email protected] tmp]#

输入换行符和输出换行符同时演示  RS ORS

[[email protected] tmp]# awk -v RS="#" -v ORS="+" ‘{print NR,$0}‘ test

1 luliechu+2 123

lixuhuan+3 150

+[[email protected] tmp]# cat test

luliechu#123

lixuhuan#150

自定义变量案例

[[email protected] tmp]# awk ‘BEGIN {myname="luliechu" ; print myname}‘

Luliechu

时间: 2024-10-12 19:31:13

awk最简单明了入门方法的相关文章

C#语言提供foreach语句,该语句提供一种简单明了的方法来循环访问数组的元素。

http://you.ctrip.com/events/manzhouli319/3576647.html http://you.ctrip.com/events/manzhouli319/3576649.html http://you.ctrip.com/events/manzhouli319/3576651.html http://you.ctrip.com/events/manzhouli319/3576653.html http://you.ctrip.com/events/manzho

Android中关于JNI 的学习(零)简单的例子,简单地入门

Android中JNI的作用,就是让Java能够去调用由C/C++实现的代码,为了实现这个功能,需要用到Anrdoid提供的NDK工具包,在这里不讲如何配置了,好麻烦,配置了好久... 本质上,Java去调用C/C++的代码其实就是去调用C/C++提供的方法,所以,第一步,我们要创建一个类,并且定义一个Native方法,如下: JniTest类: public class JniTest { public native String getTestString(); } 可以看到,在这个方法的前

java htmlparser 简单使用入门

请尊重本人的工作成果,转载请留言,并说明转载地址,谢谢.地址如下: http://blog.csdn.net/fukainankai/article/details/27710883 前几节中,我们利用GDI+在窗口中绘制了各种各样的图形.图像,这一节,我们将会将这些图像保存成简单图像.所谓简单图像,指的是bmp/jpg/png等图像或者单帧的gif图像.保存成多帧的gif图像稍微复杂一点,本节中暂时不做说明.保存成动态的tiff文件也比较简单,但这里也不做说明,下次有机会和gif一起介绍. 另

转摘_结合个人经历总结的前端入门方法

转载请注明出处: https://github.com/qiu-deqing/FE-learning Table of Contents generated with DocToc FE-learning 必备基础技能 基本开发工具 学习方法和学习目标 入门之路 继续提高 一些个人经历 LingyuCoder的学习经历 工具 技能 语言基础 进阶 项目 未来 其他 入门书 一些不错的网站 历程 MrRaindrop的学习经历 缘起 项目,下一个项目 收集癖和知识管理 跟对神 读书 前端的定位 最

前端入门方法(大全)

转载请注明出处: https://github.com/qiu-deqing/FE-learning Table of Contents generated with DocToc FE-learning 必备基础技能 基本开发工具 学习方法和学习目标 入门之路 继续提高 一些个人经历 LingyuCoder的学习经历 工具 技能 语言基础 进阶 项目 未来 其他 入门书 一些不错的网站 历程 MrRaindrop的学习经历 缘起 项目,下一个项目 收集癖和知识管理 跟对神 读书 前端的定位 最

简单Python入门技巧

简单Python入门技巧 Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起.常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3]  有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库.需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现. Python

WEB开发中一些常见的攻击方式及简单的防御方法

WEB开发中一些常见的攻击方式及简单的防御方法 20151127 转载http://www.lvtao.net/dev/582.html SQL注入最常见的攻击方式,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击. 跨站脚本攻击(XSS)跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取

Python简单爬虫入门二

接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们BeautifulSoup的基本结构如下 #!/usr/bin/env python # -*-coding:utf-8 -*- from bs4 import BeautifulSoup import requests headers = { 'User-Agent':'Mozilla/5.0 (Win

前端神器之Sublime Text2/3简单明了使用总结

为什么叫神器呢? 我总结如下: 第一:也是最重要的,它占内存很小(就如同notepad++那般迅速打开,所以那款其实也不错~).一般IDE比如WebStorm(它也是一款神器来着),Aptana(也比较常用),还有前后结合的Zend Studio 等都略显臃肿,打开太慢,耗内存太大. 第二:主题丰富,漂亮的界面.各式各样的主题可以满足你的视觉美. 第三:支持的插件丰富多样.很多插件都能让你获得不一样的体验. 第四:支持命令快捷键方式.就如同vim那般有广阔的命令快捷. 好吧,那就来下载安装吧.