grep
(匹配)
grep:
sed
(匹配和替换)
sed:
sed [options] {sed-commands} {input-file}
options
-n 取消自动打印
-f 指定sed 命令文件
-e 执行多个命令
sed -n -e '/^root/ p' -e '/^nobody/ p' /etc/passwd
sed -n \
-e '/^root/ p' \
-e '/^nobody/ p' \
/etc/passwd sed -n '{
/^root/ p
/^nobody/ p
}' /etc/passwd -E 使用正则表达,不用转义\
-i 直接写入文件,-i.bak 创建一个.bak备份文件
-c 与-i一起使用,防止文件所有权变化
-l 行数
sed-commands
1,5 1到5行
1~5 从第1行开始,每隔5行
/Jason/,4 匹配到Jason开始,直到第4行
/Raj/,/Jane/ 匹配到Raj的行到匹配到Jane的行
/Jason/,+2 匹配到Jason的行与之后2行
$ 最后一行或行尾
/^xxx/ 以xxx开头,忽略空格
p 输出
d 删除
/^$/ 空行
/^#/ #注释行
w 写入文件
s/xxx/x/ 查找替换
s/xxx/x/2 将第2次出现的xxx替换
s/xxx/x/2p 第2次出现的xxx替换并打印
s/xxx/x/i 忽略大小写
s/^/ls -l / 在每一行行首添加ls -l
s/^/ls -l /e 上面基础并执行
s/^/ls -l /gipw g全局,i忽略大小写,p打印,w写入文件
sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt 等同于下面
sed 's|/usr/local/bin|/usr/bin|' path.txt
sed 's^/usr/local/bin^/usr/bin^' path.txt
sed 's@/usr/local/bin@/usr/bin@' path.txt
sed 's!/usr/local/bin!/usr/bin!' path.txt
sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt 将xxx变成[xxx],&匹配到的字符串
\([^,]*\) 匹配直到第一个,
s/\([^,]*\).*/\1/g 输出第一组
sed 's/\(\b[A-Z]\)/\(\1\)/g 如果第一个字母大写则添加()
s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]{3\}\)/\1\2,\3/g (1)匹配开头或除了数字和.字符(2)匹配一个或多个数字(3)匹配3个数字
. 匹配单个字符,不包括数字
? 匹配前面的元素零次或一次
+ 匹配前面的元素一次或多次
| 选择(二选一)
* 匹配前面的元素零次或多次
[ ] 匹配包含在方括号内的单个字符
[^ ] 匹配括号内未包含的单个字符
{m,n} 匹配前面的元素至少m次但不超过n次
s/John/JO\lHNNY/p \l单个字符小写 \L后面全部字符小写 \u单个字符大写 \U后面全部字符大写 \E结束前面的大小写转换
/\bthe\b/ 匹配完整the
2 a 203,Jack Johnson,Engineer 第二行后面添加,i 之前插入, c 代替
= 行号
q 退出,r 读取文件并打印到另一个文件指定位置下面一行
/Jane/ !p 相当与grep -v
awk
(匹配、替换,更强大)
awk:
awk -Fs '/pattern/ {action}' input-file
or
awk -Fs '{action}' intput-file
-F 字段分隔符。 如果不指定,将使用空格作为字段分隔符
/pattern/ 是可选的。 如果不提供它,awk 将处理输入文件中的所有记录。 如果您指定一个模式,它将只处理输入文件中与给定模式匹配的那些记录。
{action} - 这些是awk 编程命令,可以是一个或多个awk 命令。 整个动作块(包括所有的 awk 命令)应该包含在 { } 之间
awk -F: '/mail/ {print $1}' /etc/passwd 只处理包含关键字 mail 的记录
-f 指定awk脚本文件
BEGIN { awk-commands } 起始块
END { awk-commands } 结束块
awk -F ',' '/^102/ {print "Emp id 102 is", $2}’ xxx 合并打印出来(有,则中间包含空格,没,则中间不包含空格)
awk 'BEGIN {FS="[,:%]"} {print $2, $3}' test.txt 以不同分隔符
awk -F ',' 'BEGIN { OFS=":" } { print $2, $3 }' xxx 打印分隔符,合并打印出来(不包含空格)
awk -F, 'BEGIN { RS=":" } { print $2 }' xxx 将:替换成回车