sed
擅长取行,awk
命令擅长取列
sed
- 格式:
sed <option> <script> <file>
- file不指定则默认为STDIN
option
-e
: 执行多个命令- 命令之间必须用分号隔开
- 命令末尾和分号之间不能有空格
- 例子:
sed -e 's/brown/green/; s/dog/cat/' data.txt
-f
: 从文件读取命令- 每个命令一行,无需分号
- 例子:
sed -f script.sed data.txt
-n
:不产生命令输出,用p
完成输出-i
: 直接修改文件中的数据- sed默认不会修改文件数据,而是把修改后的数据发送到STDOUT
-i.backup
自动备份源文件
script
-
s 命令:用第二个斜线间的字符串替换第一个斜线间的匹配的模式(正则)
- 格式:
sed '[address] s/pattern/replace/[flag]'
- 默认只替换每行第一处匹配的字符串
- 替换标记(flag)
<数字>
:第几处模式匹配的地方g
:替换所有匹配的文本p
:配合-n
option只打印被修改过得行sed -n 's/test/dev/p' in.txt
- 也可以用来输出指定行
- 输出3-6行:
sed -n '3,6/p' in.txt
- 输出3-6行:
w <file>
:把修改过得行写入文件,同时打印所有行(包括没修改的)- 可以用
-n
option不打印 - 把2-6行输出到
out.txt
文件中:sed ‘2,6w out.txt’ in.txt
- 可以用
i
: 匹配时忽略大小写
- 默认的斜线分隔符不易处理路径,所以也可以用
|^@!
中任意一个当分隔符- 例子:
sed 's!/bin/bash!/bin/sh!' /etc/passwd
- 例子:
- 只替换选定行(address)
- s前加数字区间即可
- 只替换2,3行:
sed '2,3 s/dog/cat/' in.txt
- 从第2行开始替换后面的行:
sed '2,$ s/dog/cat/' in.txt
- 替换第2行以及后面3行:
sed '2,+3 s/dog/cat/' in.txt
&
: 当它用在替换字符串中的时候,代表的是原始的查找匹配数据- 把文件中的每一行,使用引号包围起来:
sed 's/.*/"&"/' in.txt
- 把文件中的每一行,使用引号包围起来:
- 格式:
-
d命令:删除匹配的内容
- 如果没有
-i
option,则只是不输出匹配的行 - 删除第三行:
sed -i ‘3 d’ in.txt
- 如果没有
-
i命令:在匹配的行前增加新行
- 格式:
sed ‘[address] i\<new line>’ <file>
- 注意是反斜杠
- 在第二行前添加:
sed ‘2 i\hello world’ in.txt
- 格式:
-
a命令:在匹配的行后增加新行
- 在最后一行后添加:
sed ‘$ a\hello world’ in.txt
- 在最后一行后添加:
-
c命令:替换行
- 用一行替换3-5行:
sed ‘3,5 c\hello world’ in.txt
- 用一行替换3-5行:
-
y命令:转换单个字符
- 格式:
sed '[address] y/<inchars>/<outchars>/' <file>
- 把inchars中字符转换为outchars对应的字符(多个一对一映射)
- 因此长度必须相同
- 所有inchars匹配到的字符都会转换
- 例子:
echo “12345” | sed ‘y/345/678/’
- 把inchars中字符转换为outchars对应的字符(多个一对一映射)
- 格式:
-
l命令:还原不可见字符
- 例子:
echo “a b” | sed -n ‘l’
- 输出
a\tb
- 输出
- 例子:
-
r命令:读取文件中的数据并插入
- 例子:
sed -i '3 r data.txt' in.txt
- 例子:
sed与正则
常用例子
# 查看第5-7行和10-13行
sed -n -e '5,7 /p; 10,13 /p'
# 删除第3行并备份
sed -i.backup '3 d'
# 删除空行
sed -i '/^$/d'
参考
awk
- 格式:
awk <options> <program> <file>
- file不指定则默认为STDIN
option
-f
: 从文件读取命令- 必须以
{}
开头结尾 - 每个命令一行,无需分号
- 必须以
-F
: 自定义字段分隔符- 默认分隔符是空白符
- 例子:
awk -F: '{print $1}' /etc/passwd
program
-
可以自定义变量
- 引用自定义变量时不需要
$
- 默认变量
$0
代表整个文本行$1
代表第1个数据字段$n
代表第n个数据字段
- 引用自定义变量时不需要
-
关键字
BEGIN
:在处理数据前执行后面定义的脚本- 两段命令仍需在同一单引号内
- 例子:
awk 'BEGIN {print "hello world!"} {print $0}'
END
:在处理数据后执行后面定义的脚本
-
在命令之间加分号可以执行多个命令
awk与正则
常用例子
参考
来源:CSDN
作者:_萤火
链接:https://blog.csdn.net/winter_wu_1998/article/details/104091472