linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

shell脚本最常见的一个用途就是处理文本文件。检查日志文件、读取配置 文件、处理数据元素,shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动化。但仅靠shell脚本命令来处理文本文件的内容有点力不从心的。如果想在shell脚本中处理任何类型的数据,掌握grep,sed和gawk工具可以达到事半功倍的效果。企业开发中常用,高阶命令。

linux文本处理三剑客:grep+sed+awk(gawk)

16.0 grep的使用

所有的类linux系统都会提供一个名为grep(global regular expression print,全局正则表达式输出)的搜索工具

grep命令在对一个或多个文件的内容进行基于模式的搜索的情况下是非常有用的。模式可以是单个字符、多个字符、单个单词、或者是一个句子。当命令匹配到执行命令时指定的模式时,grep会将包含模式的一行输出,但是并不对原文件内容进行修改。一般和管道符|一起使用。

1.0.1grep在单个文件中查找单词

grep ds_user /etc/passwd

 

16.0.2 grep常见的用法

1.grep在多个文件中查找单词

 grep ds_user /etc/passwd /etc/shadow /etc/gshadow

 

2.使用-l参数列出包含指定模式的文件的文件名,既哪个文件里这个单词

grep -l  ds_user /etc/passwd /etc/shadow /etc/gshadow

 

3. 使用-n参数,在文件中查找指定模式并显示匹配行的行号

grep -n  ds_user /etc/passwd

 

5. 使用-v参数输出不包含指定模式的行

grep -v  ds_user /etc/passwd

  6. 使用 ^ 符号输出所有以某指定模式开头的行.。同样可以使用 $ 符号输出所有以指定模式结尾的行

grep ^root /etc/passwd

grep bash$ /etc/passwd

 

7. 使用 -c 参数计算模式匹配到的数量

grep -c  bash$ /etc/passwd

 16.1 sed编辑器

sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed编辑器会执行下列操作

16.1.1 sed编辑器概述

sed编辑器执行流程大致如下:

  1. 一次从输入中读取一行数据。
  2. 根据所提供的编辑器命令匹配数据。
  3. 按照命令修改流中的数据。
  4. 将新的数据输出到STDOUT。

核心原理剖析:

  1. 在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流
  2. 编辑器处理完流中的所有数据行后,它就会终止。
  3. 由于命令是按顺序逐行给出的, sed 编辑器只需对数据流进行一遍处理就可以完成编辑操作。
  4. 这使得 sed 编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。

16.1.2 sed语法格式

1.语法格式:

sed options  script file

2.常用参数罗列:

  • -e script 在处理输入时,将script中指定的命令添加到已有的命令中
  • -f file 在处理输入时,将file中指定的命令添加到已有的命令中
  • -n 不产生命令输出,使用print命令来完成输出

注意:

script 参数指定了应用于流数据上的单个命令。如果需要用多个命令,要么使用 -e 选项在

命令行中指定,要么使用 -f 选项在单独的文件中指定。有大量的命令可用来处理数据。

16.1.3 sed使用案例

默认情况下, sed 编辑器会将指定的命令应用到 STDIN 输入流上。这样你可以直接将数据通过管道输入 sed 编辑器处理。

1.命令行简单使用演示

1. sed单行文本修改

echo " this is a test " | sed 's/test/big big test/'

 

注意:sed编辑器中使用了 s 命令。 s 命令会用3个斜线间指定的第二个斜线间的文本字符串来替换第一个斜线建文本字符串模式,前提是能匹配到第一个文本,尤其注意空格的等特殊字符。

2.sed替换文本中信息输出

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

命令使用:sed 's/dog/and fat cat/'  ./sed_demo

 

特别注意的是:要记住,sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到STDOUT 。如果你查看原来的文本文件,它仍然保留着原始数据。可以cat查看一下。如果想保存结果直接使用重定向即可。

3. 命令行使用多个编辑器命令 sed -e

sed -e  's/brown/green/; s/dog/cat/' ./sed_demo

两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。这里同时替换输出两处。

 4.加强版,从文件中读取命令,处理文本文件

如果有大量要处理的 sed 命令,那么将它们放进一个单独的文件中通常会更方便一些。

可以在 sed 命令中用 -f 选项来指定文件,类似于hive脚本执行。

vi  s.sed 存放sed命令(注意这里可以用加单引号)

s/brown/green/

s/fox/elephant/

s/dog/cat/

5.生产案例

hdfs dfs -du -h /user/*/.Trash

hdfs dfs -du -h /user/*/.Trash |awk '{if($2=="T") print$0}'|sort -nrk 1

16.2 awk与gawk概述与使用

虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制。通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来修改和重新组织文件中的数据。这正是awk/gawk能够做到的

16.2.1 awk与gawk概述

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响

gawk程序是Unix中的原始awk程序的GNU版本,gawk程序让流编辑迈上了一个新台阶,他提供了一种编程语言而不只是编辑命令

 

生产经常给需要排查报错,查询日志。但在日志文件中找出错误行会很难,gawk程序可以让你从日志文件中过滤出需要的数据元素,然后你可以将其格式化,使得重要的数据更易于阅读。

gawk的强大之处在于程序脚本。可以写脚本来读取文本行的数据,然后处理并显示数据,创任何类型的输出报告。

gawk有很多种用法,功能强大,内容很多,先掌握基础的,使用时知道怎么查即可,网上很多脚本都是现成的学会检索,学会修改。创新是几倍,几十倍的生产力提升。我们大多数人做的其实就是优化,优化做好了就很腻害了。

16.2.2 awk与gawk的使用

1. 标准语法格式

gawk ‘{options }’program file

注意构成 gawk 脚本的语句须包含在一对大括号( {} )中而作为命令选项的整个脚本需要包含在一对引号中。

2.细分语法格式:

gawk '{pattern + action}'  {filenames}

#pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令

awk工作流程:

 

  1. 通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
  2. 完成 BEGIN 块的执行,开始执行body块
  3. 读入有 \n 换行符分割的记录。
  4. 将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),$1 表示第一个域,$n 表示第 n 个域。
  5. 依次执行各 BODY 块,pattern 部分先匹配该行内容成功后,才会执行 awk-commands 的内容。
  6. 循环读取并执行各行直到文件结束,完成body块执行。
  7. 开始 END 块执行,END 块可以输出最终结果。

尖叫提醒:

  1. 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
  2. BEGIN开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况下,我们可以在开始块中初始化一些变量。BEGIN 是 AWK 的关键字,因此它必须是大写的。注意:开始块部分是可选的,你的程序可以没有开始块部分。
  3. 主体块(BODY)对于每一个输入的行都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK 都会执行命令。但是,我们可以将其限定在指定的模式中。注意:在主体块部分没有关键字存在。
  4. 结束块(END)结束块是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。 与开始块相似,结束块也是可选的。

awk的运算符:

 

gawk常用内置变量:

 

gawk的语法格式与参数

1.gawk使用字段变量:

gawk 会自动地将每行文本中的每个数据字段赋值给一个指定的变量,默认情况下,预先定义的变量为:(注意:文本行中的数据字段是通过预先定义的字段分隔符来分隔开的,默认为空格(包括 TAB ))

  • $0 表示一整行文本
  • $1 表示该行文本的第一个字段
  • $2 表示该行文本的第二个字段
  • $n 表示该行文本的第 n 个字段

案例演示:

0.直接输出

awk '{ print $0}' ./dbtable_data.txt 

注意,当然gawk也支持其他分隔符,-F参数指定如下:

gawk -F,  '{print $2}'  2.txt

1.gawk对正则的匹配支持

1.1 正则匹配~ 表示模式开始,两个斜杠// 中是正则匹配模式。

输出第二列包含 "applist",并打印整行,或者第一第二行

awk -F, '{ print $1 }' dbtable_data.txt

awk -F',' '$2 ~ /applist/ { print $1,$2 }'   dbtable_data.txt

awk -F',' '$2 ~ /device.*applist/ { print $1,$2 }'   dbtable_data.txt

awk -F',' '$2 ~ /^fin.*applist/ { print $2 }'   dbtable_data.txt

awk  'BEGIN {FS=","} ;{ print $1 }' dbtable_data.txt

1.2.正则匹配,模式取反。!~ 表示模式开始。// 中是模式。

输出第二列不包含 "applist",并打印整行,或者第一第二行

awk -F',' '$2 !~ /applist/ { print $1,$2 }' dbtable_data.txt

2.多个命令

gawk 语言允许在脚本语句中组合多个命令使用,只需要在各命令之间使用分号 ; )分隔开即可

gawk -F, '{ $2="HELLO";print $2}' dbtable_data.txt

3. 处理前,处理后BEGIN,END

默认情况下,gawk 从输入中读取一行文本,再对该文本执行程序指令。而有时候需要在读取待处理数据之前先执行某些指令,此时就要用到BEGIN关键字。同样的,END 关键字允许你指定在数据处理完成后才执行的脚本。

awk 'BEGIN{a=5;a+=5;print a}'

awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'

gawk 'BEGIN {print "我准备开始干活了"}; {print $0}; END {print "活我干完了"}' 2.txt

4.gawk命令通过脚本获取执行

语法格式:gawk -f 脚本名   文件名

gawk 允许先将其程序脚本保存在某个文件中,再通过 -f 选项指定该文件的文件名。而在脚本文件中,各命令不再需要通过 ';' 符号分隔,直接分行列出即可,但是注意需要用{}括起来。

5.gawk匹配检索

awk -F ',' '{ if($2 =="device_applist_join_full_monthly") print $0}'  000000_0

awk -F ',' '{ if(($2 =="device_applist_join_full_monthly")) print $0}'  

注意if判断可以使用两个小括号,也可以使用一个,结果一样

 

6. gawk其他相关操作(nr,nf等)

$ awk -F":" '{ print $1 }' /etc/passwd

$ awk -F":" '{ print $1 $3 }' /etc/passwd  #没有分隔,自动拼接字符串

$ awk -F":" '{ print $1 $3 }' /etc/passwd  #结果空格分隔

$ awk -F":" '{ print $1 " " $3 }' /etc/passwd  #空格分隔

$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3}' /etc/passwd

https://images2015.cnblogs.com/blog/1089507/201701/1089507-20170126222420597-662074402.jpg

案例1:NR只查看文件内第20到第30行的内容

awk '{if(NR>=20 && NR<=30) print $1}' table.txt 

案例2:NF的使用,打印某行字段数是N个的行数据

awk -F ":" 'NF==8{print $0}' awk_testdata.txt

16.3sed,gawk,grep对比

  1. grep 更适合单纯的查找或匹配文本
  2. sed 更适合编辑匹配到的文本
  3. awk 更适合格式化文本,对文本进行较复杂格式处理

16.4 sort排序使用

sort是在Linux里非常常用的一个命令,管排序的。Linux sort 命令用于将文本文件内容加以排序。sort 可针对文本文件的内容,以行为单位来排序。

sort其实比较原理简单粗暴:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

1.sort的格式:  sort  选项  文件

2.sort常见的参数

  1. sort -u作用很简单,就是在输出行中去除重复行。
  2. sort -r默认的排序方式是升序,如果想改成降序,就加个-r就搞定
  3. sort -n -n选项,来告诉sort,“要以数值来排序”,默认sort按照字符排序
  4. sort -k指定需要排序的列
  5. sort -t设置排序时所用的分隔字符,指定行字段的分隔符是什么

3.案例演示

3.1.sort演示

3.2.sort -u去重排序

3.3 sort -r降序

4.sort排序后数据保存以及sort-n使用

 

5.指定分隔符以及指定排序-t,-k

综合案例:

hdfs dfs -du -h /user/*/.Trash |awk '{if($2=="T") print$0}'|sort -nrk 1

尖叫总结: linux文本处理内容庞大而繁杂,抓住主线,需要用的时候去查询,学习不要死记硬背。关键是把握方法哈。有些使用需要结合工作场景讲解。大家入门学习掌握这些就够了,其他的需要时百度即可。 

猜你喜欢

转载自blog.csdn.net/qq_26442553/article/details/121877190