1. awk grep sed


awk统计
grep查找
sed替换

一. awk

1.1 awk命令

在文件或者字符串中,基于制定规则浏览和抽取信息

awk '{pattern + action}' {filenames}

awk以行为单位,每接收一行,然后执行相应的命令
pattern :在数据中查找的内
action :找到匹配内容时所执行的一系列命令

例子如下:

awk [-F  field-separator]  'commands'  input-file(s)

执行过程:读入一行数据,按照field-separator进行划分,填充到$1-$10等域中,执行commands,再进行下一行,当然需要先执行begin,最后执行end,例子如下:

cat /etc/passwd |awk  -F ':'  'BEGIN {print "begin"}  {print $1","$7} END {print "end"}'

1.2 awk内置变量

变量 作用
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0变量是指整条记录
$1表示当前行的第一个域
$2表示当前行的第二个域...
例子如下:
awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

输出时,printf可以带格式

awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

1.3 awk编程

例子
统计/etc/passwd的账户人数,count是变量,{}中的语句可以有多条,用;分开

awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd

统计某个文件夹下的文件占用的字节数

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'

条件语句
和c语言类似,统计某文件夹下文件占字节大小,过滤超过4096大小文件

ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 

循环语句
和c语言类似:while、do/while、for、break、continue
数组
下标为key,值为value,存储在hash表中。

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

二. grep

2.1 用法

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

将/etc/passwd,有出现 root 的行取出来

grep root /etc/passwd
cat /etc/passwd | grep root 

将/etc/passwd,有出现 root 的行取出来, 同时显示行号

grep -n root /etc/passwd

将/etc/passwd,将没有出现 root 的行取出来

grep -v root /etc/passwd

将/etc/passwd,将没有出现 root 和nologin的行取出来

grep -v root /etc/passwd | grep -v nologin

用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示

dmesg | grep -n -A3 -B2 --color=auto 'eth'

根据文件内容递归查找目录

grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件
grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件
grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件

2.2 grep与正规表达式例子

[]中的内容仅代表一个字符,如果全部的字母和数字可以用[a-zA-Z0-9]

grep -n 't[ae]st' regular_express.txt

字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g

grep -n '[^g]oo' regular_express.txt

假设我 oo 前面不想要有小写字节

grep -n '[^a-z]oo' regular_express.txt

我们要取得有数字的那一行

grep -n '[0-9]' regular_express.txt

行首与行尾字节 ^ $

grep -n '^the' regular_express.txt #the只在行首列出
grep -n '^[a-z]' regular_express.txt #开头字母是小写
grep -n '^[^a-zA-Z]' regular_express.txt #不想要开头是字母

^符号:在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义

grep -n '\.$' regular_express.txt #找出,行尾结束为小数点 (.) 的那一行

找出空白行

grep -n '^$' regular_express.txt

任意一个字节 . 与重复字节 *
o*代表空或任意个o

grep -n 'g..d' regular_express.txt #g??d字符串,中间一定有两个内容
grep -n 'ooo*' regular_express.txt #至少两个o
grep -n '[0-9][0-9]*' regular_express.txt #任意数字

限定出现次数{}

grep -n 'o\{2\}' regular_express.txt #2次以下
grep -n 'go\{2,5\}g' regular_express.txt #2-5次
grep -n 'go\{2,\}g' regular_express.txt #两个以上的另一种写法

2.3 扩展grep

grep -E 或者 egrep, 增加了额外的正则表达式元字符集
打印所有包含NW或EA的行

egrep 'NW|EA' testfile
grep 'NW\|EA' testfile #在扩展元字符前面加\自动扩展

搜索所有包含一个或多个3的行

egrep '3+' testfile
grep -E '3+' testfile
grep '3\+' testfile   

首先含有2字符,其后紧跟着0个或1个点,后面再是0和9之间的数字。

egrep '2\.?[0-9]' testfile 
grep -E '2\.?[0-9]' testfile
grep '2\.\?[0-9]' testfile 

搜索一个或者多个连续的no的行

egrep '(no)+' testfile
grep -E '(no)+' testfile
grep '\(no\)\+' testfile   #3个命令返回相同结果

2.4 不使用正则表达式

fgrep 查询速度比grep命令快,但是不能使用正则,如下两种方法

fgrep  '*' /etc/profile
grep -F '*' /etc/profile

三. sed

3.1 用法

sed [-nefri] ‘command’ 输入文本  

常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

3.2 例子

删除某行

sed '1d' ab              #删除第一行 
sed '$d' ab              #删除最后一行
sed '1,2d' ab           #删除第一行到第二行
sed '2,$d' ab           #删除第二行到最后一行

显示某行

sed -n '1p' ab           #显示第一行 
sed -n '$p' ab           #显示最后一行
sed -n '1,2p' ab        #显示第一行到第二行
sed -n '2,$p' ab        #显示第二行到最后一行

使用模式进行查询

sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

增加一行或多行字符串

sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n

代替一行或多行

sed '1c Hi' ab                #第一行代替为Hi
sed '1,2c Hi' ab             #第一行到第二行代替为Hi

替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)

sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"

插入

sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"

删除匹配行

sed -i '/匹配字符串/d'  filename

替换匹配行中的某个字符串

sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
posted @ 2016-08-01 21:41  zhangshihai1232  阅读(236)  评论(1)    收藏  举报