4、awk之文本操作运算
awk是一种操作数据流的行和列的工具,也是一种编程语言。awk有很多内建的功能,比如数组、函数等,这和C语言有相同之处。
sudo apt-get install gawk #
awk 'BEGIN{print "start"}
pattern{print "do something"}
END{print "end"}'
#BEGIN 变量初始化
#pattern 命令执行
#END 数据流结束后的打印输出等
#三块均可选
1.awk的工作原理:
- (1)执行BEGIN {commands}语句块中的语句。
- (2)从文件或stdin中读取一行,然后执行pattern {commands}。重复此过程,直到文件全部被读取完毕。
- (3)当读至输入流末尾时,执行END {commands}语句块。
#例子
echo -e "a\nb\nc" | awk 'BEGIN{i=0}{i++}END{print i}'
#输出:3
2.awk中的特殊变量:
- NR 表示记录数量(number of records),执行过程中对应于当前行号
- NF表示字段数量(number of fields),在执行过
程中对应于当前行的字段数 - $0该变量包含执行过程中当前行的文本内容
- $1该变量包含第一个字段的文本内容
- $2该变量包含第二个字段的文本内容
3.awk中的控制语句
#if
{if(expression){
statement;...}
else{
statement;...
}
}
#while
while(expression)
{
statement;
}
4.数组
echo|awk 'BEGIN{
A["apple"]=2
A["peach"]=3
A["orange"]=4
A["banana"]=5
n=0
}
END{
for(i in A)
{
n++
printf("%d\t%s\t%d\n",n,i,A[i])
}
}
----------------------
1 banana 5
2 peach 3
3 orange 4
4 apple 2
5.awk与文件
awk '{print $1*2, $2}' data.txt #将第一个字段乘2
awk -v scale=5 '{print $1*scale, $2}' data.txt #将第一个字段乘传入的一个参数scale(=5)
5、sed之流编辑器
- sed(stream editor). sed编辑器通过输入到命令行上的命令或者存储在命令文本文件中的命令来操作数据流中的数据。它每次从输入中读取一行数据, 并用提供的编辑器命令匹配该数据,按命令中指定的操作修改数据,然后将生成的新数据输出到stdout(标准输出)。
- 注意sed编辑器操作结果一般不改变原文本或原文件的数据。可以使用输出重定向将sed的输出结果保存到文件中。
- sed 以按顺序逐行的方式工作,过程为:
– 从输入读取一行数据存入临时缓冲区,此缓冲区称为模式空间( pattern space)
– 按指定的 sed 编辑命令处理缓冲区中的内容
– 把模式空间的内容送往屏幕并将这行内容从模式空间中删除
– 读取下面一行。重复上面的过程直到全部处理结束。 - sed 的命令格式:
sed options script file
options参数为允许定制sed命令的行为。
options | 含义 |
---|---|
‐e command | 将command添加至处理输入时运行的命令中 |
‐f command_file | 将command_file中的命令集添加至处理输入时运行的命令中 |
‐n | 不要为每条命令产生输出,但会等待打印命令 |
script参数指定了在数据流上的单条命令。如果需要不止一条命令,就需要采用‐e
选项在命令行上指定它们,或者采用‐f
选项在一个单独文件中指定它们。
- sed替换命令格式:
•sed 's/pattern/replacement/flags'
• pattern是要被替换的文本
• replacement是要插到数据流中的新文本
• flags参数控制替换如何进行。替换标记如下:
g 表明所有该文本出现的地方都应该被替换
p 表明原来行中的内容应该被打印出来 - sed 插入命令
sed '[address]command\
new line'
command为i(insert)或者a(append)。 new line必须在单独一行。
echo -e "dog \ncat \nelephent \ntigger" | sed 1,2d
#删1、2行,显示大象、老虎
echo -e "dog \ncat \nelephent \ntigger" | sed -n 1,2d
#啥也不显示
echo -e "dog1 dog2\ncat\nelephent\ntigger"|sed '/dog1/d'
#删除含有dog1的行
echo -e "dog dog\ncat\nelephent\ndog\ntigger"|sed 's/dog/fox/'
#将每行第一个dog换成fox
echo -e "dog dog\ncat\nelephent\ndog\ntigger"|sed 's/dog/fox/g'
#将所有的dog换成fox
echo -e "dog dog\ncat\nelephent\ndog\ntigger"|sed -n 's/dog/fox/'
#啥也不显示
echo -e "dog dog\ncat\nelephent\ndog\ntigger"|sed -n 's/dog/fox/p'
#打印了被修改的两行
echo -e "dog dog\ncat\nelephent\ndog\ntigger"|sed '1s/dog/fox/'
#只对第一行进行替换操作
echo -e "dog dog\na cat is smart\nelephent\ndog\ntiger"|sed '/cat/s/smart/agile/'
#将含有cat的那一行中的smart 换成 agile
echo -e "dog dog\na cat is smart\nelephent\ndog\ntiger"|sed '/cat/{
s/smart/agile/
s/a/some/
s/is/are/
s/cat/cats/
}'
#多重替换
echo -e "dog dog\ncat fox\nelephent bird\nseal salmon"|sed '2c\
changing the 2nd line'
#修改标准输入的第二行,用changing the 2nd line覆盖第二行
echo -e "dog dog\ncat fox\nelephent bird\nseal salmon"|sed '1,3w animal.txt'
#修改标准输入的第1至3行写入文件 animal.txt
sed '2r student.txt' animal.txt
#将student.txt 的文本插入到animal.txt 文件的第二行开始
#sed一般不会对原文件进行修改