关于sed和awk


取最后一个"_"之前的全部内容:

echo "dump.skeleton_editor_1_6to7" | sed 's/_[^_]*$//'

每行开头加上个时间:

cat test|sed 's/^/'$(date +"%F_%T" -d @1362964188)'   /'

增加序列

ps -ef|awk '{if ($1=="proxy") print NR,$NF}'

只显示每行的第一个单词(删除所需要的内容后面的全部内容)

sed -r 's/^( [a-Z]+)[^a-z] .*/1/' /etc/passwd 非数字用户
## w*$    //重复的w结尾

换行替换成逗号

sed ':a;N;s/\\n/,/;ta'

显示2个关键字之间的内容

sed -n -e '/To:/,/subject:/p' filename

删除第一行和最后一行

sed  '1d;$d'

显示3到最后一行

sed -n '3,$p'

SED练习

1.删除文件每行的第一个字符
sed 's/^.//' /etc/passwd
2.删除文件每行的第二个字符
sed -r 's/'^( . ) ./1/' /etc/passwd
3.删除文件每行的最后一个字符
sed 's/.$//' /etc/passwd
4.删除文件每行的倒数第二个字符
sed 's/. ( .)$/1/' /etc/passwd
5.删除文件每行的第二个单词
sed -r 's/^( [a-Z]+[^a-Z]+)[a-Z]+/1/' /etc/passwd
6.删除文件每行的倒数第二个单词
sed -r 's/[a-Z]+([^a-Z]+[a-Z]+)$/1/' /etc/passwd
7.删除文件每行的最后一个单词
sed -r -e's/[a-Z]+$//' -e's/[a-Z]+(:)/1/'/etc/passwd
8.交换每行的第一个字符和第二个字符
sed -r 's/'^( . ) ( . )/21/' /etc/passwd
9.交换没行的第一个字符和第二个单词
sed -r 's/^( .)( [a-z]+[^a-Z]+)( [a-Z]+)/321/'/etc/passwd 非数字帐户
10 交换没行的第一个单词和最后一个单词
sed -r 's/^( [a-Z]+)( [^a-z].*[^a-Z]) ([a-z]+)$/321/' /etc/passwd 非数字帐户
11 删除一个文件中所有的数字
sed -r 's/[0-9]//g' /etc/passwd
12 删除每行开头的所有空格
sed -r 's/^[ ]//g' /etc/passwd
13 用制表符替换文件中出现的所有空格
sed -r 's/[ ]+/t/g' /etc/passwd
14 把所有大写字母用()括起来
sed -r 's/( [A-Z])/(1)/g' /etc/passwd
15 打印每行三次
sed '{p;p; } ' /etc /passwd
16 隔行删除
sed -n '1~2p' /etc/passwd
17 把文件从第22 行到第33 行复制到第56 行后面
sed -e'22h' -e'23,33H' -e'56G' /etc/passwd
18 把文件从第22 行到第33 行移动到第56 行后面
sed -e'22h' -e'23,33H' -e'56G' -e '22,33d' /etc/passwd
19 打印每行的第一个单词和第三个单词
sed -r 's/^( [a-Z]+)[^a-Z]+[a-Z]+[^a-Z]+([a-Z]+)[^a-Z] .*/1 2/'/etc/passwd
20 将格式为 mm/yy/dd 的日期格式改为 mm;yy;dd
sed -r's@/@;@g' /etc/passwd

AWK练习

1. 功能是打印所有输入行
awk '{print $0} ' f ilename
2. 打印输入文件第八行
awk 'NR==8{print $0} ' f ilename
3. 用awk打印文件所有行的第一个字段
awk -F:'{print $1} ' f ilename
4. 打印输入行总数
awk 'BEGIN{num=0;} {num++;}END{print num} ' f ilename
awk 'END{print NR}' f ilename
5. 打印每行字段数
awk -F: '{print NF,$0} ' f ilename
6. 打印最后一行的最后一个字段的值
Awk -F: 'END{print $NF} ' filename
7. 打印字段数大于等于4个的行
Awk -F: ‘NF>=4{print $0} ’ f ilename
8. 打印文件所有字段的总数
Awk -F: 'BEGIN{count=0}{count=count+NF:}{print count} ' f ilename
9. 打印UID在 30-40范围内的用户名
Awk -F: '$>=30&&S3<=40{print $1}' f ilename
10.倒叙排列文件的所有字段
awk -f : '{for( i=NF;i>0:i--) }{ if ( i!=1} {printf "%s: " ,$i};}else{printf ("%sn" ,$i) ; }
#!/bin/awk -f
BEGIN{
F=": "
}
{
for( i=NF;i>0;i--)
{
if( i!=1)
{
printf ("%s: " ,$i)
}
Else
{
printf ("%sn",$i)
}
}
}
11.打印5 到26 行
Awk -F: 'NR>=5&&NR<=26{print} ' f ilename12.在文件顶部加上标题“Document“
Awk 'BENGIN{print“Document}{print} 'f ilename
13.隔行删除
Awk '{ if (NR%2==1) {print } }' f ilename
14.打印字段数大于5的行的总数
Awk -F: 'BEGIN{num=0; } { if(NF>=5) {num++;}} END {print num;}' f ilename
15.编写一个 awk脚本,统计/dev中各类型文件数量
#!/bin/awk -f
BEGIN{
ff=0
dd=0
bb=0
cc=0
pp=0
ss=0
ll=0
}
{
if($0 ~/^-/)
{
ff++
}
if($0 ~/^p/)
{
pp++
}
if($0 ~/^b/)
{
bb++
}
if($0 ~/^/)
{
cc++
}
if($0 ~/^d/)
{
dd++
}
if($0 ~/^l/)
{
ll++
}
if($0 ~/^s/)
{s++
}
}
END{
Print "f ile: ", f f
Print "directory: " ,dd
print" character: ",cc
print" block: " ,bb
print" link: " ,ll
print" sockt : ",ss
print" pipe: " ,pp
}
16.编写一个 awk脚本,读取IP来自一个文件,并且测试该IP地址
#!/bin/awk -f
{
if(system("ping-c 1 " $0">/dev/null)==0)
{
Print $0 YES
}
else
{
Print $0 NO
}
}
17.编写一个 awk脚本,读取文件添加用户
#!/bin/awk -f
{
If (system("useradd" $0 2>/dev/null) ==0)
{
Print "user: " $0"add"
}
else
{
Print "user"$0"error"
}
}
18.编写一个 awk脚本,功能过滤出合法IP地址
#!/bin/awk -f
BEGIN{
FS=" : "
}
{
if( 1>0&&$1<255&&$2>=0&&$2<=255$3>=0&&$3<=255$4>=0&&$4<=255{
Print $0
}
}
19.编写一个 awk脚本,功能是每行抽取第一个单词
#!/bin/awk -f
BEGIN{
FS=" [^a-Z]+"
}
{ f irst=0
f lag=0
for( i=1;i<=NF;i++)
{
If ($I !=NULL}
{
if(f lag==0)
{
f irst=I
f lag=1
}
}
}
Print $f irst
}
20.编写一个 awk脚本,功能是打印每行的第一个和最后一个单词
#!/bin/awk -f
BEGIN{
FS=" [^a-Z]+"
}
{ f irst=0
f lag=0
last=0
for( i=1;i<=NF;i++)
{
If ($I !=NULL}
{
last=i
if(f lag==0)
{
f irst=I
f lag=1
}}
}
Print $f irst " " $last
}