BLOG

Record, summarize, and improve.

sed & awk

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 将:替换成回车