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],即A、B、C一直到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