Shell编程之正则表达式(awk)

正则之Awk

1.什么是awk:

awk不仅仅是一个文本处理工具,同时也是一门编程语言,

是linux上功能最强大的数据处理工具之一。

2.awk 语法格式:

awk [options] 'commands' filenames

awk [options] -f awk-script-file filenames

处理的文件是/etc/hosts 总共三行

BEGIN 行处理前动作 {}行处理中 END行处理后

BEGIN{print 1/2} {print "OK"} END{print "Over"}

    0.5            ok            GameOver

                     ok

                     ok

#命令 command

行处理前      行处理          行处理后

BEGIN{}        {}              END{}

#BEGIN发生在读文件之前

[root@Shell ~]# awk 'BEGIN{print 1/2}'

0.5

#BEGIN在行处理前,修改字段分隔符

[root@shell ~]# awk 'BEGIN{FS=":"} {print $1}' /etc/passwd

#BEGIN在行处理前,修改字段读入和输出分隔符

[root@shell ~]# awk 'BEGIN{FS=":" OFS="---"}{print $1,$2}' /etc/passwd

#示例:

[root@shell ~]# awk 'BEGIN{print 1/2} {print "ok"} END{prrint "Game Over"}' /etc/hosts

0.5

ok

ok

ok

Game Over

=========================================

3.awk 命令格式:

#示例1,匹配awk 'pattern' filename

[root@shell ~]# awk '/root/' /etc/passwd

#示例2,处理动作 awk '{action}' filename

[root@shell ~]# awk -F:'{print $1}' /etc/passwd

=========================================

示例3,匹配+处理动作 awk 'pattern {action}' filename

[root@shell ~]# awk -F ':' '/root/{print $1,$3}' /etc/passwd

[root@shell ~]# awk 'BEGIN{FS=":"} /root/{print $1,$3}' /etc/passwd

示例4:判断大于多少则输出什么内容 command |awk 'pattern {action}'

[root@shell ~]# df |awk '/\/$/ {if($3>50000)print $4}'

4.Awk工作原理:

# awk -F:'{print $1,$3}' /etc/passwd

1.awk将文件中的每一行作为输入,并将每一行赋值给内部变量$0,以换行符结束。

2.awk开始进行字段分隔,每个字段存储在已编号的变量中,从$1开始[默认空格分隔]

3.awk默认字段分隔符是由内部FS变量来确定,可以使用-F修订。

4.awk行处理时使用了print函数打印分割后的字段。

5.awk在打印后的字段加上空格,因为$1,$3之间有一个逗号,逗号被映射至OFS内部变量中,

称为输出字段分隔符。OFS默认为空。

6.awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,

然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕。

=========================================

例子1:

[root@shell ~]# cat awk_file.txt

ll 1989 55 56 63

kk 1990 60 57 64

hh 1991 70 58 65

jj 1992 80 59 66

mm 1993 90 60 67

1)awk指定多个分隔符,awk默认以空白行作为分隔符

#1.如何查看文件中的第一列:

[root@shell ~]# awk '{print $1}' awk_file.txt

ll

kk

hh

jj

mm

#2.如果有的文件不是以空格为分隔符怎么办?

比如:/etc/passwd

[root@shell ~]# awk -F ":" '{print $2}' awk_file.txt

1989 55 56 63

1990 60 57 64

[root@shell ~]# awk -F "[: ]" '{print $2}' awk_file.txt

1989

1991

1992

1993

1994

=========================================

#[: ]+

  1.连续的多个冒号当一个分隔符

  2.连续的多个空格当一个分隔符

  3.连续空格和冒号也当做一个分隔符

"#[: \t]+"

  4.连续空格和tab也当做一个分隔符

  5.连续tab也当做一个分隔符

  6.连续的冒号空格tab都算一个分隔符

===================================

例子2:

统计一行里有多少个数量,一共5个

[root@shell ~]# awk '{print NF}' awk_file.txt

5

5

5

5

5

======================================

1.awk内置变量NF,保存每行的最后一列

#1.通过print打印,NF和$NF,你发现了什么?

[root@shell ~]# awk '{print NF,$NF}' awk_file.txt

5 63

5 64

5 65

5 66

5 67

#2.使用$NF为什么就能成功?(因为NF变量保存的是每一行的最后一列)

[root@shell ~]# awk '{print $NF}' awk_file.txt

63

64

65

66

67

#3.如果一个文件很长,靠数列数需要很长的时间,

那么如何快速打印倒数第二列?

[root@shell ~]# awk '{print $(NF-1)}' awk_file.txt

56

57

58

59

60

2)awk内置变量NR,表示记录行号

#1.使用pring打印NR,会发现NR会记录每行文件的行号

[root@shell ~]# awk '{print NR,$0}' awk_file.txt

1 ll 1989 55 63

2 kk 1990 60 64

--------------------------------------------

#2.[root@shell ~]# awk 'NR==3{print $0}' awk_file.txt

hh 1991 70 58 65

#3.那如果我们想打印第二行到第三行的内容怎么办?

[root@shell ~]# awk 'NR>1&&NR<4 {print NR,$0}' awk_file.txt

2 kk 1990 60 57 64

3 hh 1992 70 58 65

#4.那如果只想打印第三行,该怎么办?

[root@shell ~]# awk 'NR==3 {print NR,$00}' awk_file.txt

3 hh 1992 70 53 63

#5.那如果既想打印第三行,又想打印第一列?

[root@shell ~]# awk 'NR==3 {print NR,$1}' awk_file.txt

3 hh

===============================================

4.awk内置变量,$0保存当前记录的内容

[root@shell ~]#  awk '{print $0}' /etc/passwd 

5.awk内置变量,FS指定字段分隔符,默认是空格?

#以冒号作为字段分隔符:

[root@shell ~]#  awk -F:'/root/{print $1,$3}' /etc/passwd

[root@shell ~]#  awk '{BEGIN{FS=":"}  {print $1,$3} '  /etc/passwd

内置变量

NF      #记录每行内容的最后一列,通常记录的是一个整数

NR     #记录行号

FS     #指定字段分隔符

OFS  #指定输出字段分隔符

$0     #代表每行的所有内容

$1,$2  #指定字段分隔符后,每列的内容

print   #输出内容

printf  #格式化输出

===============================================

5.awk模式匹配与动作处理

awk语句都由模式和动作组成,模式部分动作语句何时触发事件,如果省略模式部分,动作将时刻保持执行状态,模式可以是条件语句或复合语句或正则表达式。

(1)正则表达式

#匹配记录(整行)

[root@shell ~]# awk '/^root/' /etc/passwd 

#匹配字段,匹配操作符(~ !~)

[root@shell ~]#  awk '$1~/^root/' /etc/passwd

(2)条件表达式

[root@shell ~]# awk -F: '{if($3>300) print $0}' /etc/passwd

(3)条件判断:

//统计系统用户数量

[root@shell ~]#  awk -F: '{ if($3>0 && $3<1000){i++}} END {print i}' /etc/passwd

[root@shell ~]#  awk -F: '{ for(i=1;i<=10;i++) {print $0} }' passwd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,271评论 0 8
  • 报告生成器,格式化文本输出,常用选项: -F:指明输入时用到的字段分隔符 -v var=value:自定义变量 介...
    毛利卷卷发阅读 521评论 0 1
  • awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信...
    想赚钱的雷大阅读 504评论 0 3
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,569评论 0 4
  • awk使用说明 awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常...
    好好学习的蜗牛阅读 499评论 0 2