linux 三剑客 "awk grep sed"

awk整理

wk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

语法:awk ‘{pattern + action}’ {filenames}
pattern 表示 AWK 在数据中查找的内容,pattern就是要表示的正则表达式,用斜杠括起来。
action 是在找到匹配内容时所执行的一系列命令
{}不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组

*awk的调用方式:*
a.命令行调用方式
b.shell脚本调用方式:将所有的awk命令插入一个文件,使awk程序可以执行。
示例:

[root@localhost Desktop]# cat  username.sh 
#!/bin/awk
awk -F ':' '{print $1}' /etc/passwd
[root@localhost Desktop]# sh username.sh 
root
bin
...................

c.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file

awk命令形式:

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v]   -F指定分隔符,-f调用脚本,-v定义变量 var=value
'  '         引用代码块
BEGIN        初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
//           匹配代码块,可以是字符串或正则表达式
{}           命令代码块,包含一条或多条命令
;           多条命令使用分号分隔
END         结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

特殊要点:

$0           表示整个当前行
$1           每行第一个字段
NF           字段数量变量
NR           每行的记录号,多文件记录递增
FNR          与NR类似,不过多文件记录不递增,每个文件都从1开始
\t           制表符
\n           换行符
FS           BEGIN时定义分隔符
RS           输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==           等于,必须全部相等,精确比较
!=           不等于,精确比较
&&          逻辑与
||           逻辑或
*            匹配时表示1个或1个以上
/[0-9][0-9]+/     两个或两个以上数字
/[0-9][0-9]*/     一个或一个以上数字
FILENAME         文件名
OFS              输出字段分隔符, 默认也是空格,可以改为制表符等
ORS              输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'        定义三个分隔符

awk的变量和赋值:

[root@localhost Desktop]# awk '{count++;print$1;} END{print"user is",count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
................................
user is 40

常用命令:

print 是awk打印指定内容的主要命令
awk '{print "a"}'   /etc/passwd   
打印每行第一个匹配的字符
awk -F: '{print $1; print $2}'   /etc/passwd
以:为分割符,打印每行的第一个字段和第二个字段,每个字段还行
awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd 
以:为分割符,打印每行的第一三六字段,以表格形式打印
[root@localhost Desktop]# awk 'NR<=5 && NR>=2' /etc/passwd
打印大于第二行小于第五行
[root@localhost Desktop]# echo | awk '{print 10^2+20}'
120
进行综合数运算

grep整理

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来
格式:

grep [options]

[options]参数

-a      不要忽略二进制数据
-c      计算符合范本样式的列数
-d      当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
-E      将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
-i      忽略字符大小写的差别
-I      列出文件内容符合指定的范本样式的文件名称
-n      在显示符合范本样式的那一列之前,标示出该列的编号
-q      不显示任何信息
-s      不显示错误信息
-v      反转查找
-w      只显示全字符合的列
-x      只显示全列符合的列
-o      只输出文件中匹配到的部分

正则表达式主要参数:

\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]A符合要求 。
[ - ]:范围,如[A-Z],即ABC一直到Z都符合要求 。
. :所有的单个字符。
* :有字符,长度可以为0。

注意:

默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:明确要求搜索子目录:grep -r或忽略子目录:grep -d skip

常用命令:
只输出文件中匹配到的部分:

[root@localhost Desktop]# echo hello nihao. | grep -o -E '[a-z]+\.'
nihao.

使用正则表达式:

[root@localhost Desktop]# echo hello nihao. | grep -E '[a-z]+'
hello nihao.

输出包含匹配字符串的行数:

[root@localhost Desktop]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

seq整理

seq命令可以输出连续的数字,或者输出固定间隔的数字,或者输出指定格式的数字
语法:

seq [options]    尾数
seq [options]    首数  尾数
seq [options]    首数  增量 尾数

[options]选项

-f      --format=格式
-s      --separator=字符串,使用指定的字符串分割数字(默认使用个"\n"分割)
-w      --sequal-width  在列前添加0 使得宽度相同

示例:
生成5以内的整数

[root@localhost Desktop]# seq 5
1
2
3
4
5

生成0-10之间的偶数:

[root@localhost Desktop]# seq 0 2 10
0
2
4
6
8
10

产生99~102之间的整数,并且要求输出数字宽度相同:

[root@localhost Desktop]# seq -w 99 101
099
100
101
还有其他方法:
[root@localhost Desktop]# seq -f '%03g' 99 101
099
100
101
###% 后面指定数字的位数 默认是"%g","%3g"那么数字位数不足部分是空格###
[root@localhost Desktop]# seq -f '%3g' 99 101
 99
100
101
###-w 指定输出数字同宽   不能和-f一起用###
[root@localhost Desktop]# seq -f "int%03g" 99 101
int099
int100
int101

指定分割符:

-s 指定分隔符  默认是回车
[root@localhost Desktop]# seq -s ":" -f "%3g" 99 101
 99:100:101

猜你喜欢

转载自blog.csdn.net/weixin_39249306/article/details/81148011