BASH&AWK编程浅谈 --在文本处理中的应用

这是之前在公司给同事培训的资料整理的。

目录

1.shell的题外话

2.shell的基础

3.常见的shell文本处理命令

4.awk 编程

5 awk shell 混合编程实例

6.常见的一些问题

7.和其他脚本语言的比较  

 

1.1 What' s the Shell

Shell 诞生于 Unix,是与 Unix/Linux 交互的工具        近几年来,Shell一直被忽略,是一个不受重视的脚本语言。Shell虽然是Unix的第一个脚本语言,但它是相当优秀的。它结合了延展性与效率,持续保有独具的特色,并不断的被改良,使它多年来能与那些花招很多的脚本语言保持抗衡。

短处:  Shell需要依赖其他程序才能完成大部分的工作,繁杂的命令和参数,以及window Man对于linux环境生疏很难入门。

长处:简洁的脚本语言标记方式,而且比C语言编写的程序执行更快、更有效率,短小精悍。

1.2 shell的种类

Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。Bourne shell是UNⅨ最初使用的shell,并且在每种UNⅨ上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

查看系统支持的shell类型:

1.3 Shell执行命令的方式

交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。

批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

2.1 一个简单的脚本模版

#!/bin/bash
# 
#
# author by * *
# date 2015-12-28
# 
export LC_ALL=C
# 函数块
function init()
{
  theDay="$1"
  if [ "$theDay" = "" ]
  then
    theDay=`date +%Y%m%d -d "1 days ago"`
  fi

}
#主函数
function main(){
init "$1"
#打印一个变量
echo "${theDay}"
}
main "$1" 

3 shell文本常用命令

grep :文本搜索工具

sort :排序

join :合并

sed :简单的文本处理命令

wc uniq cut

其他:

~~

看实例

 4.1 awk

AWK 是一个优良的文本处理工具, Linux 及 Unix 环境中现有的功能最强大的数 据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷 德 · 艾侯、彼得 · 温伯格和布莱恩 · 柯林汉姓氏的首个字母)的最大功能取决于一个 人所拥有的知识。

one demo

awk -F":" 'BEGIN{

OFS="~" }{ if($0~/^root/){ split($0,arr,":"); print $0; } } END{ printf("------%s%s------\n"," 分 "," 割 "); for(i in arr){ print arr[i]; } }' /etc/passwd

4.2 内置变量

属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第 n 个字段,字段间由 FS 分隔 FS 输入字段分隔符 默认是空格 NF 当前记录中的字段个数,就是有多少列 NR 已经读出的记录数,就是行号,从 1 开始 RS 输入的记录他隔符默 认为换行符 OFS 输出字段分隔符 默认也是空格 ORS 输出的记录分隔符,默认为换行符 ARGC 命令行参数个数 ARGV 命令行参数数组 FILENAME 当前输入文件的名字 IGNORECASE 如果为真,则进行忽略大小写的匹配 ARGIND 当前被处理文件的 ARGV 标志符 CONVFMT 数字转换格式 %.6g ENVIRON UNIX 环境变量 ERRNO UNIX 系统错误消息 FIELDWIDTHS 输入字段宽度的空白分隔字符串 FNR 当前记录数 OFMT 数字的输出格式 %.6g RSTART 被匹配函数匹配的字符串首 RLENGTH 被匹配函数匹配的字符串长度 SUBSEP \034

 4.3 awk怎么样获得外部传入变量

1.获取普通变量

格式如: awk ‘ {action} ’ 变量名 = 变量值 注意:变量名与值放到’ {action} ’后面。

2.BEGIN

程序块中变量

,这样传入变量,可以在

action

中获得值。

格式如: awk –v 变量名 = 变量值 [–v 变量 2= 值 2 …] 'BEGIN{action} ’ 注意:用 变量可以在 3 中类型的 action 中都可以获得到,但顺序在 action 前面。

3.

获得环境变量

-v

传入

只需要调用: 是它的键值。

awk

内置变量

ENVIRON,

就可以直接获得环境变量。它是一个字典数组。环境变量名 就

4.4 awk内置函数

awk

拥有较为丰富的内置函数,足以满足大部分的数据处理,

这里各举几个例子:

1. 算术函数

int( x ) 返回 x 的截断至整数的值。 rand( ) 返回任意数字 n ,其中 0 <= n < 1

2. 字符串函数

length [(String)] substr( String, M, [ N ] ) split( String, A, [Ere] ) index( String1, String2 ) 。。。。。。

3.

一般函数

system()

执行

Command

参数指定的命令,并返回退出状态。等同于

system

子例程。

4.

时间函数 自定义函数 可以自定义

5.

function

4.5 awk流程控制

1.awk 的流程控制

2.shell 的流程控制

3. 性能对比

[chengmo@localhost nginx]# time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;}print total;}') 50005000

real 0m0.003s user 0m0.003s sys 0m0.000s [chengmo@localhost nginx]# time(total=0;for i in $(seq 10000);do total=$(($total+i));done;echo $total;) 50005000

real user sys

0m0.141s

0m0.125s 0m0.008s

awk

实现相同功能,可以看到

实现的性能是

shell

50

倍!

4.6 awk数组

1. 在 awk 中数组叫做关联数组 (associative arrays) ,因为下标记可以是数也可以是串。 awk 中的数组 不必提前声明,也不必声明大小。数组元素用 0 或空串来初始化,这根据上下文而定。

(1):可以用数值作数组索引(下标) Tarray[1]=“cheng mo”

(2):可以用字符串作数组索引(下标) Tarray[“first”]=“cheng ”

2. 几个例子:

(1) 分组求和 awk '{sum[$1]+=$2}; END{for(name in sum) print name, sum[name]}' testfile1

(2) 分组计数 awk '{count[$1]++}; END{for(name in count) print name, count[name]}' testfile2 ( 3 )判断键值存在和删除键值 awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'

awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'

 4.7 awk正则

使用 awk 作为文本处理工具,正则表达式是少不了的。 要掌握这个工具的正则表达式使用。其实,我们不必单独去学习 它的正则表达式。正则表达式就像一门程序语言,有自己语法规则已经表示意思。 对于不同工具,其实大部分表示意思 相同的。在 linux 众多文本处理工具( awk,sed,grep,perl) 里面用到正则表达式。其实就只有 3 种类型,

1.BREs, 基本的正则表达式( Basic Regular Expression 又叫 Basic RegEx 简称 BREs )

2.EREs, 扩展的正则表达式( Extended Regular Expression 又叫 Extended RegEx 简称 EREs )

3.PREs,Perl 的正则表达式( Perl Regular Expression 又叫 Perl RegEx 简称 PREs ) 这里拿三个种命令来对比: 1 ) grep 支持: BREs 、 EREs 、 PREs 正则表达式 \

2) sed 文本工具支持: BREs 、 EREs

3)Awk 文本工具支持: EREs 实例:

1.awk 语句中: awk ‘/REG/{action}’ /REG/ 为正则表达式,可以将 $0 中,满足条件记录 送入到: action 进行处理 . ep : awk 'BEGIN{info="this is a test";if( info ~ /test/){print "ok"}}'

2.awk 内置使用正则表达式函数 gsub( Ere, Repl, [ In ] ) sub( Ere, Repl, [ In ] ) match( String, Ere ) split( String, A, [Ere] )

4 5. awk&shell编程实例

实际的文本处理过程中还是要结合丰富的 shell 命令来编写的, 这里取几个常见的例子来给大家展示一下应用的场景:

1.web 日志分析

2. 数据挖掘

3.roi 推广数据分析

6.shell 编程的常见问题

1. 文档类型不对( dos2unix

2. 特殊符号( tab 符)

3. 代码混乱没有结构化

4. 管道滥用

5. 不写注释

6. 混淆语法,没有系统的学习

谷哥,熟能生巧

7. 工具版本语法不同

shell

命令,多求助

man

,度娘,

7 文本处理的几个语言工具的对比

1.sed 一般用作文本初步处理,主要用在批量替换里面,对列处理的功能要差一些

2.awk 列处理功能强大,和 sed 一起使用,因为利用 sed 可以很方便的使用正则,正则方面 awk 就弱了点。结合 sed 可以降低代码复杂度。

3.perl Perl 借取了 C 、 sed 、 awk 、 shell 脚本语言以及很多其他程序语言的特性,其中最重要 的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库 CPAN 。简而言之, Perl 像 C 一样强大,像 awk 、 sed 等脚本描述语言一样方便,被 Perl 语言爱好者称之为 “ 一 种拥有各种语言功能的梦幻脚本语言 ” 、 “Unix 中的王牌工具 ” 。

缺点:也正是因为 Perl 的灵活性和 “ 过度 ” 的冗余语法,也因此获得了 write-only 的 “ 美誉 ” , 因为许多 Perl 程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。

4.Ruby

5.Python 和 rRuby 一样,容易上手,但是代码量上不占优势

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值