相关文章推荐
酷酷的盒饭  ·  【图像处理】详解 ...·  1 年前    · 
成熟的火柴  ·  Delphi之Virtual ...·  1 年前    · 

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 
...................

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

awk命令形式:

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中;
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块;
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块;
[-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个或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}'
进行综合数运算

利用awk命令进行求和,求平均值,求最大值,求最小值

  1. 求第n列数值的和
awk '{sum +=$n}  END {print "sum = ",sum}'
awk -F '指定分割符' '{sum +=$n}; END {print "sum =" ,sum}'
  1. 求平均值
    求第n列的平均值
awk '{sum +=$n}  END {print "average = ",sum/NR}'
awk -F '指定分割符' '{sum +=$n}; END {print "average =" ,sum/NR}'
  1. 求最大值
    求第n列最大的值
awk 'BEGIN {max = 0} {if ($n > max) max=$n fi} END {print "max = ",max}'
awk  -F '指定分割符' 'BEGIN {max = 0} {if ($n > max) max=$n fi} END {print "max = ",max}'

求第n列的最小值,最小值设置足够大

awk 'BEGIN {min = 1999999} {if ($n < min) min=$n fi} END {print "min = ", min}'
awk -F '指定分割符' 'BEGIN {min = 1999999} {if ($n < min) min=$n fi} END {print "min = ", min}'

分组求和
文件含有两列数据

[root@localhost ~]# more 1.txt 

以第一列为变量名,以第一列为变量,将相同的第一类的第二列数据进行累加并且打印第一类和第二列和

[root@localhost ~]# awk '{s[$1]+=$2} END {for(i in s)print i,s[i]}' 1.txt 

$1为第一列,s表示第一列为变量名,for i in s表示循环第一列数据ABCDE,在循环输出是会按照数据的ascii码进行排序。

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

生成0-10之间的偶数:

[root@localhost Desktop]# seq 0 2 10

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

[root@localhost Desktop]# seq -w 99 101
还有其他方法:
[root@localhost Desktop]# seq -f '%03g' 99 101
###% 后面指定数字的位数 默认是"%g","%3g"那么数字位数不足部分是空格###
[root@localhost Desktop]# seq -f '%3g' 99 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
                    基础操作1.mkdir mkdir命令用来创建目录,此命令属于内建命令。语法:mkdir (选项)(参数)-Z:设置安全上下文,当使用SELinux时有效-m&amp;amp;amp;amp;amp;lt;目标属性&amp;amp;amp;amp;amp;gt;或--mode&amp;amp;amp;amp;amp;lt;目标属性&amp;amp;amp;amp;amp;gt;建立目录的同时设置目录的权限-p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录-
				
1、打印文件第一列(域) : awk '{print $1}' filename 2、打印文件的前两列(域) : awk '{print $1,$2}' filename 3、打印完第一列,然后打印第二列  : awk '{print $1 $2}' filename 4、打印文本文件的总行数 : awk 'END{print NR}' filename 5、打印文本第一行 :awk '
linux三剑客一、Linux grep命令详解二、Linux sed命令完全攻略三、Linux awk命令详解 一、Linux grep命令详解 很多时候,我们并不需要列出文件的全部内容,而是从文件找到包含指定信息的那些行,要实现这个目的,可以使用 grep 命令。 grep 命令作为 Linux 文本处理三剑客的一员,另外两个sedawk,它们会在后续章节作详细介绍。 grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统,搜索的模式(patterns)被称为正则表达式
Linux最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。 我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。 在说这三个命令前我们要插入一个小插曲就是“正则表达式”。 一、正则表达式 所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实...
  linux uniq命令怎样将文件某一列重复的行删除?   例如文件 number1.txt 存储了你的电话簿信息,其第一列是联系人,第二列是手机号码。电话簿存在一个人有多个手机号码的情况,但你只想让每个人仅保留一个手机号码,将多余的手机号去除。 number1.txt : Li 13800001115 Li 13800001112 Zhang 13800001118 Wang 13800001112 Zhang 13800001114 Wu 13800001113  这时候可以分
镜像下载、域名解析、时间同步请点击 阿里云开源镜像站 作为一个经常在服务器上游走的后端,需要熟悉不少命令行操作。其grepsedawk号称"linux三剑客",使用频繁,功能强大,本文通过一个实例演示下基本用法。首先准备一个文本文件,命名为text.txt,内容如下: cat text.txt 1 province 省份 青海省 2 domain 域名或者ip tianfengyinlou.cn 3 subject_no 主体备案号
一句话总结:擅长文本分析及处理,熟知常用命令及差别。 1、^表示行首,$表示行尾;1表示第一行,$表示最后一行 2、命令字c替换的是行,s是替换指定字符串;d是删除一行,删除某个字符串直接用s即可 zjy@ubuntu:~$ echo "like love" | sed "s/like//" 3、命令字i是插入到行前,命令字a与其相反,是追加在行后 4、命令字p
grep 命令 :强大的文本’搜索’工具 1.grep -n 'word' file_name 在file_name文件找到word所在的所有行并显示。-n 为显示行号。 2.grep 'w[ea]ll' file_name 在file_name文件找到wall 或者是well 所在的所有行并显示 3.grep 'w[^e]ll' file_nam