收集的一些 grep/sed/awk 范例

$ cat datafile
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

显示所有包含 San 的行
$ grep 'San' datafile

显示所有以 J 开始的行
$ grep '^J' datafile

显示所有以 700 结束的行
$ grep '700$' datafile

显示所有不包含 834 的行
$ grep -v '834' datafile

显示所有生日为 12 月的行
$ grep '[:::]12/' datafile
$ grep '.*:.*:.*:12/' datafile
$ grep ':12/' datafile

显示所有区号为 408 的行
$ grep '^.*:408-' datafile

显示工资为 6 位数的行,并加上行号
$ grep -n '^.*:.*:.*:.*:[0-9]\{6\}' datafile

显示包括 lincoln 的行,不区分大小写
$ grep -i 'lincoln' datafile

将 Jon 的名字换为 Jonathan
$ sed 's/Jon/Jonathan/g' datafile

删除前三行
$ sed '1,3d' datafile

显示 5-10 行
$ sed -n '5,10p' datafile

删除包含 Lane 的行
$ sed '/Lane/d' datafile

显示所有生日在 11-12 月的
$ sed ':1[12]\//p' datafile

将 *** 添加到 以Fred 开头的行
$ sed '/Fred/s/Fred/***&/' datafile

用 hello 替换包含 Jose 的行
$ sed '/Jose/s/.*/hello/g' datafile

将 Popeye 的生日改成 11/14/46
$ sed '/Popeye/s/[0-9][0-9]\/\[0-9][0-9]\/[0-9][0-9]/11\/14\/46\/' datafile

删除所有的空白行
$ sed '/^$/d' datafile

$ cat datafile
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300

显示所有的电话号码
$ awk -F: '{print $2}' datafile

显示 Dan 的电话号码
$ awk -F: '$1~/Dan/{print $2}' datafile

显示 Susan 的电话号码和姓
$ awk -F: '$1~/^Susan/{print $1","$2}' datafile

显示所有以 D 开头的姓名
$ awk -F: '$2~/^D/[print $2]' datafile

显示所有以一个 C 或者 E 开头的名
$ awk -F: '$1~/^C|E/{print $1}' datafile

显示只有 4 个字符的名
$ awk 'length($1)==4{print $1}' datafile

显示所有区号为 916 的人名
$ awk -F: '$3~/\[916\]/{print $1" "$2}' datafile

实现跟
$ cut -d: -f 1 /etc/passwd
一样的效果
$ sed 's/:.*//g' /etc/passwd

删除每行最后两个字符
$ sed 's/..$//g datafile

删除每行的前两个字符
$ sed 's/^..//g'

在 Beijing 这行最后添加 2008
$ cat datafile
Beijing
London

$ sed 's/B.*/& 2008/' datafile
$ sed '/^B/s/Beijing/& 2008/' datafile

将行的第一个 Beijing 后加上 2008,在最后一个 Beijing 后加上 2008
$ cat datafile
Beijing Beijing Beijing Beijing
London London London London

$ sed 's/\(Beijing\)\(.*\)\(Beijing\)/\1 2008\2\3 2008/g' datafile

打印出 2005 到 2007 的数据
$ cat datafile
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007

$ sed -n '/2005/,/2007/p' datafile

打印1,2,4 行的内容
$ sed -n -e '1,2p' -e '4p' datafile

将 ins.txt 的内容添加到 mysed.txt 文件中 Beijing 2005 的下面
$ cat ins.txt
===china===

$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008

$ sed '/2005/r ins.txt' mysed.txt

将 mysed.txt 中的 Beijing 2003 Beijing 2004 写入到 new.txt 中
$ sed '/200[3-4]/w new' mysed.txt

将 china 这个字符串插入到包含 2007 行的下面
$ sed '/2007/a\china' mysed.txt

将 china 这个字符串插入到包含 2007 行的上面
$ sed '/2007/i\china' mysed.txt

将包含 2004 这行的下面一行的全部换成大写
$ sed '/2004/{n;y/eijing/EIJING/;}' mysed.txt

取出匹配 eth 字符串的前 3 行 3 行
$dmesg | grep -n -A3 -B3 –color=auto 'eth'

在 /etc/passwd 第二行下面加上 hello
$ head /etc/passwd | sed '2a hello'

将 1,2 两行改为 hello
$ head /etc/passwd | sed '1,2c hello'

直接修改文件
$ sed -i 's/a/b/g' test

在文件末尾加上 test
$ sed '$a test' test

NR,NF 范例
$ last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'

取出 uid < 10 的用户
$ cat /etc/passwd |  awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
$ cat /etc/passwd |  awk -F: '$3 < 10 {print $1 "\t " $3}'

参考:
http://www.ha97.com/
http://roclinux.cn/
http://linux.vbird.org/