天天看点

SED与AWK

1.简介
sed是一种行编辑器,它一次处理一行内容。

2.sed调用方式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
第一种直接在命令行中执行,第二种把命令写到了脚本中,二者无本质区别。
示例(1):打印hello.txt的内容
sed -n p hello.txt
说明:
-n:sed会在处理一行文本前,将待处理的文本打印出来,-n参数关闭了这个功能
p:命令表示打印当前行
hello.txt:待处理的文件
这个指令相当于cat

3.定址
告诉sed你期望处理的行,由逗号分隔的两个数字表示,$符号表示最后一行;
当然也可以使用正则来定位期望处理的行。
示例(2):打印hello.txt的第二行到最后一行
sed -n '2,$'p hello.txt
示例(3):打印hello.txt中正则匹配"100"的行
sed -n '/100/'p hello.txt  

4.基本命令
hello.txt的内容为
1 2 3
10 20 30
100 200 300

命令:a\
在匹配行的后面加入一行文本
示例(4)匹配100的行,后面加入一行"new line"
sed '/100/'a\ "new line" hello.txt
输出内容为:
1 2 3
10 20 30
100 200 300
new line

命令:i\
在匹配行的前面加入一行文本
示例(5)匹配100的行,前面加入一行"new line"
sed '/100/'i\ "new line" hello.txt
输出内容为:
1 2 3
10 20 30
new line
100 200 300

命令:c\
将匹配行替换为目的行
示例(5)匹配100的行,替换为"new line"
sed '/100/'c\ "new line" hello.txt
输出内容为:
1 2 3
10 20 30
new line

命令:d
将匹配行删除
示例(5)删除匹配100的行
sed '/100/'d hello.txt
输出内容为:
1 2 3
10 20 30

命令:s
将匹配行替换
详细命令为:s/pattern-to-find/replacement-pattern/g
pattern-to-find:被替换的串
replacement-pattern:替换成这个串
g:全部替换,默认只替换匹配到的第一个
示例(5)讲100替换为hello
sed 's/100/hello/g' hello.txt  
输出内容为:
1 2 3
10 20 30
hello 200 300

5.元字符集
^:匹配一行的开始
$:匹配一行的结束
.:匹配某个字符
[abc]:匹配指定范围字符

6.实用命令
匹配以10开头的行,并替换为yes,并输出
sed -n 's/^10/yes/p' hello.txt
输出内容为:
yes 20 30
yes0 200 300

取出文件中行手的行号与冒号
设hello.txt的内容为
1:#!/bin/sh
2:cat hello.txt
3:exit

sed -n -e 's/^[0-9]\{1,\}://g'p hello.txt
输出结果为:
#!/bin/sh
cat hello.txt
exit


1分钟懂awk-技不在深,够用就行
1.什么是AWK
(1)Aho、Weinberger、Kernighan三位发明者名字首字母;
(2)一个行文本处理工具;
2.AWK基本原理
2.1原理:逐行处理文件中的数据
2.2语法:

awk 'pattern + {action}'
说明:
(1)单引号''是为了和shell命令区分开;
(2)大括号{}表示一个命令分组;
(3)pattern是一个过滤器,表示命中pattern的行才进行action处理;
(4)action是处理动作;
(5)使用#作为注释;
例子:显示hello.txt中的第3行至第5行

cat hello.txt | awk 'NR==3, NR==5{print;}'
2.3pattern说明
pattern参数可以是egrep正则中的一个,正则使用/pattern/
例子:显示hello.txt中,正则匹配hello的行

cat hello.txt | awk '/hello/'
说明:
(1)pattern和action可以只有其一,但不能两者都没有;
(2)默认的action是print;
例子:显示hello.txt中,长度大于100的行号

cat hello.txt | awk 'length($0)>80{print NR}'
3.内置变量
FS 分隔符,默认是空格
NR 当前行数,从1开始
NF 当前记录字段个数
$0 当前记录
$1~$n 当前记录第n个字段
例子:显示hello.txt中的第3行至第5行的第一列与最后一列

cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}'
4.内置函数
gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一个位置
length(s):s的长度
match(s,r):s是否匹配r
split(s,a,fs):在fs上将s分成序列a
substr(s,p):返回s从p开始的子串
5.操作符
5.1运算符
类似于c,支持+、-、*、/、%、++、–、+=、-=等诸多操作;
5.2判断符
类似于c,支持==、!=、>、=>、~(匹配于)等诸多判断操作;
6.控制流程
6.1.BEGIN和END
BEGIN和END本质是一个pattern。
BEGIN用于awk程序开始开始前,做一些初始化的工作;
END用于awk程序结束前,做一些收尾的工作。
例子:统计字符个数

awk '
BEGIN
{
count=0;
}
{
count+=length($0);
}
END
{
print count;
}'
6.2流程控制语句
(1)if(condition){}else{}
(2)while{}
(3)do{}while(condition);
(4)for(init;condition;step){}
(5)break/continue:如果有END,会执行END中的收尾工作
个流程控制语句用法几乎与c相同。
7.awk与shell的交互
(1)awk中使用shell中定义的变量:使用单引号即可;

#!/bin/bash
STR="hello"
echo | awk '{
print "'${STR}'";
}'
(2)awk中使用shell命令:使用双引号,或者system命令;

#!/bin/bash
echo hello | awk '{
print $0 | "cat"
}'
或者

#!/bin/bash
echo | awk '{
system("date > date.txt")
}'
(3)awk中的变量传出至shell:没有什么好方法,老老实实用文件吧;
(4)getline:awk里,从文件中读取变量到awk中

#!/bin/bash
echo | awk '{
while(getline < "date.txt")
{
print $0;
}
}'
8.结束语
对不起,楼主欺骗了你,认真看完本文或许不止1分钟。不过,如果你真的认真阅读并超过了1分钟,相信你会有收获。