Skip to content

Latest commit

 

History

History
136 lines (93 loc) · 6.43 KB

15555414518552.md

File metadata and controls

136 lines (93 loc) · 6.43 KB

#Linux下的“三剑客”

tags: #基础#,

Linux下的“三剑客”

分享来自@嘀嗒的钟

前段时间,因为工作需求,需要对大量的脏数据以及日志数据搭建数据库进行统计分析,在数据清洗入库阶段,发现“三剑客”在处理文本内容上的极大优势和效率,故对这个三个命令进行了整理, 分享给大家。

在Linux系统当中,处理文本有三个常用的模式匹配命令 grep sed awk ,这三个命令十分灵活,熟练掌握对你在Linux下文本处理效率有极大的提高。

grep的全称为: Global search Regular Expression and Print out the line,是的,你英文理解对了,grep命令主要用来查找字符串,具体命令可以像下面那样

#匹配含有root字符串的行,并打印行号

cat /etc/passwd | grep -n 'root' 或这样

#获取本机的IP地址和子网掩码

ifconfig | grep -E -o --color "<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])>.<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])>.<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])>.<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])>" grep 常用的参数

-i 表示搜索字符串的时候不区分大小写 -n 显示行号 -c 只显示匹配到的行数,不显示具体的内容 -o 只显示符合条件的字符串,但不显示整行 -v 显示不含关键字的行 -q 静默匹配模式,不输出任何信息,所以若要查看匹配的结果,需要使用echo $?来查看 -e 实现多个表达式的匹配 -w 精确匹配,及只匹配整个字符串 -Ax 显示匹配表达式之前的x行 -Bx 显示匹配表达式之后的x行 -Cx 显示匹配表达式前后各x行 -p 兼容perl的正则引擎 -E 使用扩展正则表达式 --color 对匹配关键字进行高亮显示 此外,grep还有一些不常用的参数,有兴趣的可以输入如下命令来细细把玩, 像这样

man grep

grep还有两个兄弟命令,分别为egrep, fgerp。

egrep命令,支持扩展正则表达式,相当于grep -E

fgrep命令,不支持正则表达式,只能匹配固定的字符串,相当于grep -w,但是fgrep的搜索速度要比grep -w快很多。

sed命令,sed的全称为stream editor,sed在处理时一次只读取文件的一行并对这一行进行处理,并且sed将处理后的数据只会显示在屏幕上,并不会对原文件进行修改,所以说sed是一个行编辑器。具体命令可以像下面那样

#删除/etc/passwd文件中的空白行

sed "/^$/d" /etc/passwd 或这样

#替换/etc/inittab文件中”id:3:initdefault:"一行中的数字为5

sed 's@(id:)[0-9](:initdefault)@\15\2' /etc/inittab sed常用参数

-n:静默模式,不输出模式空间内的内容,默认打印空间模式内的内容 -r:扩展的正则表达式 -f 文件:指定sed脚本文件 -i:直接编辑源文件 #编辑命令 d:删除 p:打印 i :在被指定到的行前面插入文本 a :在被指定到的行下面插入文本 r 文件路径:在指定的位置插入另外一个文件的内容 w 文件路径:将符合条件的所有行保存至指定的文件中 = 显示符合条件的所在行的行号 同样,有兴趣的可以输入如下命令来细细把玩,像这样

man sed

awk命令,awk是由Alfred Aho 、Peter Weinberger 和 Brian Kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是GNU awk,简称为gawk,awk还有一个版本,New awk,简称为nawk,但是linux中最常用的还是gawk。

awk基本语法

awk [option] 'Pattern{Action}' file awk常用参数

-v 设置变量的值 -F 指定分隔符, awk内部变量FS也可以实现分隔符的效果,像这样: -v FS=":" awk常用内置变量

FS:输入字段分隔符, 默认为空白字符 OFS:输出字段分隔符, 默认为空白字符 RS:输入记录分隔符(输入换行符), 指定输入时的换行符 ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符 NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量 NR:行号,当前处理的文本行的行号。 FNR:各文件分别计数的行号 FILENAME:当前文件名 ARGC:命令行参数的个数 ARGV:数组,保存的是命令行所给定的各参数 Action就是动作,awk中最常用的两个动作print, printf。

Pattern就是模式,通俗的讲就是条件,awk常用的模式有 BEGIN模式,END模式,关系表达式模式,正则表达式模式。

具体命令可以像下面那样

df | awk 'BEGIN{print "begining"} {print $0} END{print "ending"}' 或像这样

利用awk分割和格式化能力,可以直接对数据清洗入库

cat file | awk -F: '{ if(NF == 5) { printf "INSERT INTO table_name (col1, col2,...) VALUES (%s, %s,....)\n", $1, $2, $3, $4, $5 } }' file 同样,有兴趣的可以输入如下命令来细细把玩,像这样

man awk

[总结]

grep适合单纯的查找字符或者匹配文本,当然可以结合bash or python脚本, 实现对某个目录下字符串的查找;sed则更适合于编辑文本;awk 更适合文本格式化,这个在大数据清洗的时候,很好用。本文只是介绍了这三个命令的低阶用法,高阶用法需要大家在熟练掌握三个命令后结合实际的工作场景

另外, 推荐一张linux下常用命令的基础技能表(如图)。

[参考资料]

之前记得@余弦 曾经推荐过一系列书,其中有一本讲软件设计的书《Software Design 中文版 03》,这本书其实是日本的计算机杂志,每个月都有一期(目前还在出),但是国内的出版社貌似也就翻译了这一期,没有后续可惜了。这本杂志用了不少篇幅在讲sed和awk编程, 非常不错,我当初就是冲着awk买的,没有找到电子版,放个链接《Software Design 中文版 03》:

《Software+Design+中文版+03》【摘要+书评+试读】-+京东图书

另外,这里推荐一个国人写的awk的教程:

awk+|+朱双印博客

之前ke@ATToT分享iptables的时候,已经推荐了这个作者,确实很棒,写得非常详细。

image_15555551528852