awk和sed命令

在学习awk和sed首先了解一下linux一些常见命令grep "string" /....就是在某个文件或者目录下搜索某个字符串关键字如果加上-n的话则会显示对应的行数
例如要获取/etc/passwd中的有root的一行

1
grep -n "root" /etc/passwd

如果我要在某个目录中以及子目录中寻找某个关键字那么可以用

1
grep -nR "string" *

cut命令:

1
2
3
4
cut  -d "分割字符"  -f  字段
参数:
-d 指定我们的分割字符
-f 指定我们显示的区域

获得root用户在 /etc/passwd中以":"分割的134列的信息:
grep -n “root” /etc/passwd | cut -d “:” -f 1,3,4


sed:在sed处理数据之前需要预先提供一组规则sed 会按照此规则来编辑数据
特点:
每次仅读取一行内容
根据提供的规则命令匹配并修改数据注意sed 默认不会直接修改源文件数据而是会将数据复制到缓冲区中修改也仅限于缓冲区中的数据
将执行结果输出
演示sed的工作模式
格式

1
sed [options] '{command}[flags]' [filename]

options选项:
-e 脚本命令 该选项会将其后面的脚本命令添加到已有的命令中
-f 脚本文件 该选项会将其文件中的脚本命令添加到已有的命令中
-n 只显示匹配的行
-i 直接对原文件进行操作会修改原文件内容sed命令默认不修改文件

sed内部常见命令:
i insert在指定匹配到的行前面添加新行内容为 string
a append在指定或匹配到的行后面追加新行内容为 string
d delete删除符合地址定界条件的的行
p print默认 sed 对模式空间内的处理完毕后将输出的结果输出在标准输出
添加 p 命令相当于输出了原文又一次输出了模式匹配处理后的内容
s : 查找并替换默认只替换每行中第一次被模式匹配到的字符串 如果修饰符为 g,
则为全部替换

flags:

n : 1~512之间的数字 表示指定要替换的字符串出现第几次时才进行替换
例如一行中有 3 个 A但用户只想替换第二个 A这是就用到这个标记
g : 对数据中所有匹配到的内容进行替换如果没有 g则只会在第一次匹配成功时做替换操作
例如一行数据中有 3 个 A则只会替换第一个 A
p : 会打印与替换命令中指定的模式匹配的行此标记通常与 -n 选项一起使用

这些内容都不是用来死记硬背的用到哪里不会的话就来查查


显示 /etc/passwd第三行的信息:
sed -n “3p” /etc/passwd
在/etc/passwd中第一行前添加一行内容为Good Good Study":
sed “1iGood good study” /etc/passwd
把/etc/passwd中所有名字为root的字符串改为class
格式

sed “s/root/class/g” /etc/passwd
以上这些对passwd的操作并没有修改源文件内容如果要修改源文件内容就用-i


awk:awk更倾向于把一行分为多个"字段"然后进行处理
语法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
awk [options] 'pattern {action}' filename  

options : 可选参数
-F : 指明输入时用到的字段分隔符默认分隔符为空格或tab键
-v (var=VALUE) : 自定义变量

pattern 匹配规则
action 某些计算操作/格式化数据/流控制语句
filename文件名

示例:
awk -F ":" '{print $1}' /etc/passwd