linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, head, tail.....,学习 linux 文本处理的懒惰方式(不是最好的方法)可能是:只学习grep,sed和awk。 使用这三个工具,你可以解决近 99% linux 系统的文本处理问题,而不需要记住上面不同的命令和参数。:)
而且,如果你已经学会并使用了三者,你就会知道其中的差异。实际上,这里的差异意味着哪个工具擅长解决什么样的问题。
一种更懒惰的方式可能是学习脚本语言(python,perl或ruby)并使用它进行每个文本处理。
awk、grep、sed 是 linux 操作文本的三大利器,也是必须掌握的 linux 命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属 awk 功能最强大,但也最复杂。grep 更适合单纯地查找或匹配文本,sed 更适合编辑匹配到的文本,awk 更适合格式化文本,对文本进行较复杂格式处理。
http://t.csdn.cn/ItfEM
上手三剑客(grep,sed,awk)之前,需要熟悉正则表达式,正则表达式——事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。而正则表达式又分普通正则和扩展正则。
1.普通正则
grep ' ^s ' filename.txt # 匹配以s开头
grep ' a$ ' filename.txt # 匹配以a结尾
grep ' ^$ ' filename.txt # 匹配出空行
grep -n ' . ' filename.txt # . 匹配出所有(空行除外)
grep -n ' a* ' filename.txt # * 匹配前一个字符(a)连续出现0次或者多次
grep -n ' .* ' filename.txt # .* 表示所有(包括空行)
# # 一次匹配一个字符,可多样。[abcd],匹配a或者b或者c或者d,注意:匹配的scala和hbase中有ca、ba两个同时出现,要看具体匹配过程可加-o参数
# # 取反[^abc],即为排除abc(不高亮abc)
# 中括号区间匹配 [a-z],其中++不在小写a至z之间,所以没有高亮
# # \反斜杠转义,第一个grep由于没有转义,匹配出任意的字符,所以所有字符都高亮显示了,而第二grep加了转义符"\"反斜杠,将.转义成普通的字符,所以高亮显示了awk.sed.grep
2.扩展正则
特别说明:由于是用到了扩展正则,所以grep需要加参数 -E,你可能也见过egrep,egrep 和grep -E 完全一样,只是扩展的另一种写法
egrep ' text+ ' filename.txt # # 扩展正则+号,前一个字符(text)出现1次或者1次以上,也就是至少匹配1次
egrep ' l|k ' filename.txt # # 扩展正则|符号,匹配l或者k l|k
egrep ' s(c|p)a ' filename.txt # # 扩展正则() ,匹配sa中间是c或者p的
# # 扩展正则 {} 次数匹配
egrep ' l? ' filename.txt # # 扩展正则 ? 匹配?前的字符(l)连续出现0次或者1次,其中小写l在后面的字母hello出现了1次,scala出现0次,golang也是0次。
Linux 的三剑客指的是 awk、sed 和 grep。
awk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理。
sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。
grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。
简单概括:
名字 | 适用场景 |
awk | 用于过滤,取列,统计计算。取对应列的值,后续用于对比、计算,以及数组的计算,由于数组计算使得awk排行老大 |
sed | 用于过滤,查找行(行号、范围),增删改查。文件的修改以及日志的范围取行,如晚上0点到凌晨1点的日志 |
grep | 用于过滤,grep的命令过滤是最快的 |
具体见http://t.csdn.cn/8pdVl
grep命令用于查找文件里符合条件的字符串
grep "text" filename.txt
grep 将遍历文件 “filename.txt” 的每一行,并打印出其中 包含单词“text” 的每一行
grep -n 将遍历文件 “filename.txt” 的每一行,并打印出其中 包含单词“text” 的每一行及其行号
grep -v 将遍历文件 “filename.txt” 的每一行,并打印出其中 不包含单词“text” 的每一行及其行号
grep -c 将遍历文件 “filename.txt” 的每一行,并打印出其中 包含单词“text” 的行数
grep -i 忽略大小写,将遍历文件 “filename.txt” 的每一行,并打印出其中 包含单词“text” 的每一行
grep -x 选项只精确匹配,将遍历文件 “filename.txt” 的每一行,并打印出其中 该行只有单词“text” 的每一行
grep -A 将遍历文件 “filename.txt” 的每一行,并打印出其中 包含单词“text” 的每一行及其上下行
awk是一种用于处理文本的编程语言工具,很多方面都类似于shell(c语言),主要应用场景:统计日志,计算。其awk执行过程如下图。左边为案例,右边为流程图
在上手awk之前首先了解什么是行与列,行——awk中称为记录,单行默认以回车分割;列——awk中称为字段(类似于数据库的字段),默认用空格分割。除了行与列还需要熟悉awk的常用内置变量,以下的内置变量在接下来的案例中都有使用到
行号的内置变量是NR,运算符有> < >= <= == !=
awk ' NR==1 ' filename.txt #NR==1:取第一行
awk ' NR>=3 && NR<=6 ' filename.txt #NR>=3 && NR<=6:取3到6行(范围取行)
awk ' /spark/ ' filename.txt #/spark/:精确匹配取spark行
awk ' /java/,/spark/ ' filename.txt #/java/,/spark/:也可以匹配范围取行,比如java到spark的所有行
参数说明:
-F : 指定分隔符——每一列的结束符,默认为空格、连续空格、制表符
$数字:awk中$数字就表示第几列,$0表示处理后输出的所有
awk ' {print $1} ' filename.txt #awk取第一列
ll | awk ' {print $1,$NF} ' filename.txt #取ll 显示的第1列和最后一列($NF)
head -3 /etc/shadow | awk -v FS=' : ' -v OFS=' --- ' ' {print $5,$1} ' filename.txt #取/etc/shadow前3行的第1列和第五例,并置换位置,且输出分隔符用 ---
head -3 /etc/shadow | awk -F' : ' -v OFS=' --- ' ' {print $5,$1} ' filename.txt #取/etc/shadow前3行的第1列和第五例,并置换位置,且输出分隔符用 ---
取出 /etc/passwd 第三行至第七行,并且置换第一列与第最后一列,屏幕输出列的分割符号用%
awk -F'[ /]+' 'NR==3{print $3}'
awk——命令
-F ——选项
'NR==3{print $3}'——模式{动作} # 此处下面为模式说明
模式说明——
比较符:> < >= <= == !=
正则://,斜线里支持写扩展正则,能精确到单列,包含(~)和不包含(!~)
范围表达式:/开始/,/结束/;NR==2,NR==7 # 前者为方式一,后者为方式二
awk ' NR>1 { print $NF} ' filename.txt #从第二行开始取最后一列
awk ' $2 ~ / ^2/ ' filename.txt #取第二列以2开头
awk -F" " -v OFS=" *** " ' $NF ~ / [abc]$ / {print $1,$NF} ' filename.txt #找最后一列,以a,b,c结尾的,并显示第1列和最后一列,以***分割输出
tail -n message #看日期和时间在message文件的1、2、3列 awk ‘ / 18:50:01 /, / 18:50:01 / {print $1,$2,$3} ’ #显示message 18:50:01到19:10:01 月份日期和时间
awk -F" " '{array[$2]++} END{for (i in array) print array[i],i}' file.txt |sort -rn #统计file.txt中每个单词出现的,并按降序排列
awk -F" " '$2 ~ / ^[r-z] / {array[$2]++} END{for (i in array) print array[i],i} ' file.txt | sort -rn #统计file.txt中第二列首字母在r-z范围内,每个单词出现的次数,并按降序排列
awk for循环案例:
awk判断案例:输出磁盘使用率小于30%的所有信息
awk循环与判断进阶案例:echo "Life there are always frustrations, as long as we meet chaoyang, will see the light ahead.",输出语句中每个单词的字母数量大于等于5的单词