sed工具以及awk工具的介绍及使用

sed

++++++++++++++++++++++++++++
简介

  1. Sed是一个逐行读入数据,进行处理后输出到标准输出的非交互式编辑器.
  2. 优点:流编辑,方便地从管道读入文字,
  3. 用途
    a) 对文档进行批量编辑工作:可以将数据进行替换,删除,新增,选取特定行等功能
    b) 对程序的中间过程进行编辑处理:借助管道,自动处理中间结果。
  4. 注意:Sed只对输入处理,并在标准输出上输出,不改变原有文件内容,如果想保存结果,需要用重定向命令。

使用

  1. sed [-nefr] [动作:[n1[,n2]function]]

  2. 动作务必要以两个单引号’’括住

  3. n1,n2不见得存在,代表选择进行动作的行数;

  4. function:
    a) a:新增;
    b) c:替换,替换n1 n2之间的行;
    c) d:删除;
    d) i:插入;
    e) p:打印;
    f) s:替换,可以直接进行替换工作,可以搭配正则表达式;
    g) eg:nl /etc/passwd | sed ‘2,5d’
    h) eg:nl /etc/passwd | sed ‘2a drink tea’
    i) eg:nl /etc/passwd | sed ‘2a drink tea or……..\
    >drink beer ?
    增加两行,每一行之间都必须要以反斜杠\来进行新行的增加;

  5. 以行为单位的替换与显示功能
    a) sed ‘2,5c zhangkeluo’:以zhangkeluo替换2到5行;
    b) sed –n ‘5,7p’:显示第5,到7行,-n代表“安静模式”;

  6. 部分数据的查找替换功能:s
    sed ‘s/被替换的字符串/新的字符串/g’
    a) 当新的字符串为空时,相当于删除一个字符串;
    一步一步取出ip地址:192.168.92.130

命令:/sbin/ifconfig eth0 | grep ‘inet addr’ | sed ‘s/^.*ddr//g’ | sed ‘s/Bcast.*$//g’
```7.	删除空白行:`sed ‘/^$/d’`
8.	直接修改文件内容(危险操作)
	a)	`sed –i ‘a #this is a test’ filename` 在文件中添加一行
	b)	–i 参数直接修改文件的内容,而不是由屏幕输出;
++++++++++++++++++++++++++++
## awk:数据处理工具 ##
## 介绍 ##
1.	是一个**文本分析工具**,对文本文件进行处理以及生成报表。(grep查找,sed编辑)
2.	模式:`awk ‘条件类型1{动作类型1} 条件类型2{动作类型2}….’ Filename`
3.	awk可以处理后续接的filename,也可以读取来自前个命令的standardoutput。
4.	awk主要处理每一行的字段内的数据,默认的字段的**分割符是空格或[tab]**;
5.	每一行的每个字段都是由变量名称的,`$1/$2/$3……$0代表这一整行`;
6.	awk是**以行为一次处理的单位**,而**以字段为最小的处理单位**。

## awk处理流程 ##
1.	读入第一行,将第一行的数据填入$0,$1,$2等变量中;
2.	依据条件类型的限制,判断是否需要进行后面的动作;
3.	做完所有的动作与条件类型;
4.	如果后面还有‘行’数据,重复前三个步骤;

## 调用awk ##
1.	**命令行方式**
	awk ‘条件类型1{动作类型1} 条件类型2{动作类型2}….’ Filename
	eg:`awk ‘BEGIN{FS=”:”} $3 < 10 {print $1 “\t” $3}’`
2.	**将所有的awk命令插入一个单独文件,然后调用**:
		`awk -f awk-script-file filename` (-f选项加载awk-script-file中的awk脚本)
3.	**shell脚本方式**
		将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk

## awk内置变量(环境变量) ##
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

## awk运算符 ##
1.	关系运算符:`< ,> ,>= ,<= ,== ,!=`
2.	赋值:`= += -= *= /= %= ^= **=`
3.	C条件表达式: `? :`
4.	或 与:`|| &&`
5.	匹配正则表达式和不匹配正则表达式:`~,~!`
		eg:`$ awk '$1 ~/^root/' test`将显示test文件第一列中以root开头的行。

6.	字段引用:`$`
7.	数组成员:`in`

## 输出重定向 ##
`print items > output-file` 保存到某文件中
`print items >> output-file` 追加到某文件中
`print items | command` 使用管道交给某些命令处理
特殊文件描述符:
`/dev/stdin`:标准输入
`/dev/sdtout`: 标准输出
`/dev/stderr`: 错误输出
`/dev/fd/N`: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0
用法示例:

awk ‘BEGIN {printf “%-15s %i\n”,$1,$3 > “/dev/stderr” }’ /etc/passwd


## awk中常见的模式类型 ##
1. Regexp: 正则表达式,格式为`/regular expression/`
2. expresssion:表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和~!(不匹配)
3. Ranges: 指定的匹配范围,格式为pat1,pat2  /bash/,/awk/从被/bash/匹配到的行开始到被/awk/匹配到的行结束
4. BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
(1)BEGIN{ 这里面放的是执行前的语句 }
(2)END {这里面放的是处理完所有的行后要执行的语句 }
(3){这里面放的是处理每一行时要执行的语句}
![这里写图片描述](https://img-blog.csdn.net/20160826100351388)
5. Empty(空模式):匹配任意输入行

## awk中控制语句 ##
1.	**if-else**
	eg: `awk 'BEGIN {if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd`
2.	**while**
	eg: `awk -F: '$1!~/root/{i=1;while (i<=4) {print $i;i++}}' /etc/passwd`
3.	**do-while**
4.	**for**
	eg: `awk -F: '{for(i=1;i<=NF;i+=2) print $i}' /etc/passwd`
	for遍历数组中元素:for {A in ARRAY} {print ARRAY[A]}
5.	**case**
语法:`switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}`
6.	**break continue**
7.	**next**: 提前结束对本行文本的处理,并接着处理下一行

## awk中数组 ##
1.	数组的**下标可以是数字和字母**,数组的下标通常被称为关键字(key)。
2.	值和关键字都存储在内部的一张针对key/value应用hash的表格里。
3.	**hash不是顺序存储**,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。
4.	数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。
5.	一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
**例如**

awk -F ‘:’ ‘BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}’ /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 Sync
5 games

## awk内置函数 ##

1.	

split(string, array [, fieldsep [, seps ] ])


功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;
netstat -ant | awk '/:80/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50
2.	

length([string])

扫描二维码关注公众号,回复: 5717163 查看本文章

功能:返回string字符串中字符的个数;
3.	

substr(string, start [, length])


功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;
4.	

system(command)


功能:执行系统command并将结果返回至awk命令
5.	

systime()


功能:取系统当前时间

猜你喜欢

转载自blog.csdn.net/zhangpower1993/article/details/52325746
今日推荐