Awk-one-line(3) 十月 14th, 2009
awk 'NR<11'
#打印前十行
awk 'NR>1{exit};1'
awk 'NR<2'
#打印第一行
awk '{y=x"\n"$0;x=$0};END{print y}'
#打印最后两行
awk 'END{print}'
#打印最后一行
awk '/regex/'
#打印匹配行
awk '!/regex/'
#打印不匹配行
awk '$5=="abc123"'
awk '$5!="abc123"'
awk '!($5=="abc123")'
awk '$7~/^[a-f]/'
awk '$7 !~/^[a-f]/'
awk '/regex/{print x};{x=$0}'
awk '/regex/{print (x==""?"match on line":x)};{x=$0}'
#每行存入x
#读入下一行,如果是匹配行则输出x
#输出匹配行的前一行
awk '/regex/{getline;print}'
#getline以后如果下一行匹配,不会输出
awk '/AAA/;/BBB/;/CCC/'
awk '/AAA.*BBB.*CCC/'
awk 'length>64'
#长度大于64的行
awk 'length<64'
#长度小于64的行
awk '/regex/,0'
awk '/regex/,EOF'
#从正则到EOF
awk 'NR==8,NR==12'
#指定行
awk 'NR==52'
awk 'NR==52{print;exit}'
awk '/Iowa/,/Montana/'
awk NF
awk '/./'
删除所有空白行
awk 'a!~$0;{a=$0}'
#删除连续的重复行
awk '!a[$0]++'
awk '!($0 in a) {a[$0];print}'
#删除重复行
Awk-one-line(2) 十月 14th, 2009
awk '{sub(/\r$/,"")};1'
#CR/LF
#CR(Carriage Return, 0×0D)
#LF(Line Feed, 0×0A)
awk '{sub(/$/,"\r")};1'
#LF
awk 1
awk '{sub(/^[ \t]+/,"")};1'
#删除行前空白
awk '{sub(/[ \t]+$/,"")};1'
#删除行后空白
awk '{gsub(/^[ \t]+|[ \t]+$/,"")};1'
#删除前后空白
awk '{$1=$1};1'
#删除前后空白#?
awk '{sub(/^/," ")};1'
#行开头插入5个空格
awk '{printf "%79s\n", $0}'
#79字符宽右对齐
awk '{l=length();s=int((79-l)/2);printf "%"s+l"s\n",$0}'
#79字符宽中对齐
awk '{sub(/foo/,"bar")};1'
#替换第一个
gawk '{$0=gensub(/foo/,"bar",4)};1'
#替换第四个
awk '{gsub(/foo/,"bar")};1'
#全部替换
awk '{!/baz/{gsub(/boo/,"bar")};1'
#在不包含baz的行将foo替换成bar
awk '{gsub(/sacrlet|ruby|puce/,"red")};1'
#将scarlet,ruby,puce替换成red
awk '{a[i++]=$0};END{for(j=i-1;j>=0;)print a[j--]}'
#tac
#倒序输出行
awk '/\\$/{sub(/\\$/,"");getline t;print $0 t;next};1'
#如果一行以\结尾
#将下一行接到此行
#处理2行
awk -F ":" '{print $1|"sort"}' /etc/passwd
#排序打印所有用户名
#-F FS(Filed Sperator)
awk '{print $2,$1}'
#
awk '{temp=$1;$1=$2;$2=temp};1'
awk '{$2="";print}'
#删除第二行
awk '{for(i=NF;i>0;i--)printf("%s",i);printf("\n")}'
#倒置每一行
awk 'ORS=NR%5?",":"\n"'
#ORS输出时数据行分隔符
#用逗号链接每5行
Awk-one-line(1) 十月 14th, 2009
######AWK#ONE#LINE#############
awk '1;{print ""}'
#1表示{print} 显示当前行
#每行后面添加一行
awk 'BEGIN{ORS="\n\n"};1'
#ORS表示输出时数据行分隔符
#原始为\n设置为\n\n
#同上
awk 'NF{print$0 "\n"}'
#NF表示数据个数
#number of fields
#如果为空行则为0不执行后面的语句
awk '1;{print "\n"}'
#每行后输出2空行
#-------------------------------------------------
awk '{print FNR "\t" $0}' files*
#FNR 同NR 新文件从0开始
#NR awk开始执行之后的行数
#number of records
#打印行号
awk '{print NR "\t" $0}' files
awk '{printf("%5d: %s\n", NR, $0)}'
awk 'NF{$0=++a ":" $0};{print}'
#a初始化为1
#输出行号,不含空行
awk '{print (NF? ++a ":" : "") $0}'
#同上 ?:
awk 'END{print NR}'
#结尾输出行号
awk '{s=0;for(i=1;i<NF;i++)s=s+$1;print s}'
#输出每行每个field之和
awk '{for(i=1;i<NF;i++)s=s+$i;print s}'
#输出
awk '{total=total+NF};END{print total}'
#输出个数
awk '/Beth/{n++};END{print n+0}'
#输出包含'Beth'的行的总行数
#没有+0如果无匹配会输出空行
awk '{print NR%50?$0:$0 "\n"}'
#每50行输出一空行
awk '$1>max{max=$1;maxline=$0};END{print max,maxline}'
#输出第一列最大的行和这个数
awk '{print NF ":" $0}'
#输出每行的列数
awk '{print $NF}'
#输出最后一列
awk '{filed = $NF};END{print filed}'
#输出最后一行的最后一列
awk 'NF>4'
#输出大于4列的行
awk '$NF>4'
#输出最有一列大于4的行
awk 'BEGIN{while(a++<513)s=s" ";print s}'
#输出指定长度的字符串
gawk --re-interval 'BEGIN{while(a++<49)s=s" ";{sub{/^.{6}/,"&"s)};1'
#生成49个空格的字符串s
#在每行第6个字符后面插入s
#输出
#split{"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " "}
#for(i=1;i<=12;i++)m_digit[month[i]]=i;
#
#
awk 'length>max{max=length;longest=$0};END{print max;print longest}'
#length是每行的字符串长度
#输出最长的行
Sed FAQ -iyux-x;D 十月 12th, 2009
1.sed是什么?
流编辑器.流编辑器是什么?以流为对象的编辑器.流是什么?一种数据载体,包括输入和输出.
sed就是过滤器,过滤输入的数据,再输出数据.
2.sed怎么用?
各种命令.
3.sed的语法?
sed指令格式: [addr1[,addr2]]function[argument]
首先要指定地址,再使用操作函数,用参数进行操作
其他的另外说
4.sed地址表示?
去见man
sed的操作是以行为单位的.
first~step 指定开始的行,和间隔的行
/regexp/ 通过正则表达式匹配的行
\cregexpc 同上,c能换成任意字符
$ 最后一行
1,10 第一行到第十行
1,/regexp/ 从第一行到匹配正则表达式的行,非贪婪的
/regexp1/,/regexp2/
addr1,+N 从addr1开始的N行
addr1,~N 从addr1开始到接下来第一个N的整倍数行
地址不是必须的
5.函数?
去见man
6.-e和;?
-e分开写好看些
7.-n?
sed处理完一行/一组命令之后,会把pattern space中的数据输出,-n为不输出
8.pattern space和hold space?
sed读入一行,如果这一行匹配地址,就把这一行放入pattern space进行处理,处理完之后默认是输出并清空pattern space
G,g,x,d,D,N,n能改变.
hold space是一个缓冲区,x,h,H,能改变,
9.需要注意的?
一些产生跳转的命令
...
n.怎么学sed?
跟学tex一样.见TheTexbook.
Sed-one-line(3) 十月 11th, 2009
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
#显示 行号\n前一行\n匹配行\n下一行
#-h保证前一行在匹配行时保存在pattern space中
sed '/AAA/!d;/BBB/!d;/CCC/!d'
#包含AAA或BBB或CCC的行
sed '/AAA.*BBB.*CCC/!d'
#包含AAA和BBB和CCC的行
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
#包含AAA或BBB或CCC的行
# b label
# Branch to label; if label is omitted, branch to end of script.
#如果label被省略,跳转到脚本尾部
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
#包含AAA的行
#直到空白行,每一行附加到holdspace,然后交换到patternsapce匹配AAA
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
#包含AAA或BBB或CCC的行
#包含AAA和BBB和CCC的行
sed -n '/^.\{65\}/p'
#包含大于等于65个字符的行
sed -n '/^.\{65\}/!p'
sed '/^.\{65\}/d'
#小于65个字符的行
sed -n '8,12p'
sed '8,12!d'
#显示8-12行
sed -n '/regexp/,$p'
#匹配/regexp/的行 到 $最后一行 显示
#显示从匹配正则开始到文本结束
sed -n '52p'
sed '52!d'
sed '52q;d'
#显示第52行
sed -n '3,${p;n;n;n;n;n;n;}'
sed '3~7!d'
#从第三行开始,每7行显示一次
sed -n '/Iowa/,/Montana/p'
#显示包含Iowa的行 到Montana的行 贪婪
sed '/Iowa/,/Montana/d'
sed '$!N;/^\(.*\)\n\1$/!p;D'
#删除文件中相邻的重复行
#$!N
#/^\(.*\)\n\1$/
#!p;D
sed -n 'G;s/\n/&&/;/^\([ -~]*\n\).*\n\1/d;s/\n//;h;P'
#删除文件中的重复行
#当心缓存
#不同行都缓存在holdspace
sed '$!N;s/^\(.*\)\n\1$/\1/;t;D'
# t label
# If a s/// has done a successful substitution since the last
# input line was read and since the last t or T command, then
# branch to label; if label is omitted, branch to end of script.
#保留相邻重复行
sed '1,10d'
#删除前十行
sed 'N;$!P;$!D;$d'
#删除最后2行
sed -e :a -e '$d;N;2,10ba' -e 'p;D'
sed -n -e :a -e '1,10!{p;N;D;};N;ba'
#删除最后十行
#(1)
#(2)
sed 'n;n;n;n;n;n;n;d'
#删除8倍数行
sed '/pattern/d'
#删除匹配行
sed '/^$/d'
sed '/./!d'
#删除空行
sed '/./,/^$/!d'
sed '/^$/N;/\n$/D'
#cat -s
#多空行变一行,头尾空行删除
#(1)结尾可有一空行
#(2)开头可以有一空行
sed '/^$/N;/\n$/N;//D'
# D Delete up to the first embedded newline in the pattern space.
# Start next cycle, but skip reading from the input if there is
# still data in the pattern space.
#保留多个空行的前两行
sed '/./,$!d'
#删除文件头的空行
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'
sed -e :a -e '/^\n*$/N;/\n$/ba'
#ditto 同上
#删除文件末尾的空行
#(2)无用
#(1) ????????????????????
sed -n '/^$/{p;h;};/./{x;/./p;}'
#删除每段的最后一行
# 若一段为 A\nB\nC\n\nD
# 读入B 交换patternspace = * holdspace = B
# 读入C 交换patternspace = B holdspace = C 输出B
# 读入空行 输出空行 patternspace = * holdspace = *
# 读入D 继续
sed "s/.`echo \\\b`/g"
sed 's/.^H//g'
sed 's/.\x08//g'
sed '/^$/q'
#空行之前
sed '/^Subject: */!d;s///;q'
#??
sed '/^Reply-To: /q;/^Form:/h;/./d;g;q'
#回复地址
sed 's/ *(.*)//;s/>.*//;s/.*[:<]*//'
#邮件地址
sed 's/^/> /'
#加>
sed 's/> //'
#删>
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
#移除大部分HTML标签
sed '/./{H;d;};x;s/\n/={NL}=/g' filename|sort|sed '/s/={NL}=//;s/={NL}=/\n/g'
Sed-one-line(2) 十月 11th, 2009
sed 's/foo/bar/'
#
sed 's/foo/bar/4'
sed 's/foo/bar/g'
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/'
#替换倒数第二个
sed 's/\(.*\)foo/\1bar/'
#替换倒数第一个
sed '/baz/s/foo/bar/g'
sed '/baz/!s/foo/bar/g'
sed 's/scarlet/red/g;s/ruby/red/;s/puce/red/g'
sed '1!G;h;$!d'
#G 添加holdspace到pattern space;第一行不添加
#h 将patternsapce复制到hold space;
#最后一行不删除
#
#第一行添加到holdspace,第二行将holdspace添加到patternspace,再复制到holdspace直到最后一行.
#tac,逆序打印每一行
sed -n '1!G;h;$p'
#同上,最后打印最后一行,
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
#??????????????????????????
sed '$!N;s/\n\ /'
#最后一行不继续读
#两行合并成一行空格隔开
sed -e :a -e '/\\$/N;s/\\\n//;ta'
#\\转义为\,如果一行以\结尾,读入下一行到pattern spacee
#删除\和\n,重复
#将以\结尾的行和下一行合并
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'p;D'
#将以=开头的行和上一行合并
#D删除patternspace的第一行
#sed中循环碰到不匹配的行停止
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
#每次匹配数字和3个数字添加,
sed 'n;n;n;n;G;'
#每5行增加一行
sed '51~50/G'
#从51行开始每50行增加一行
sed 10q
#q 退出sed
#到第10行退出sed;显示前10行
sed q
#显示第一行
sed -e :a -e '$q;N;11,$D;ba'
#显示最后10行
sed '$!N;$!D'
#到倒数第二行时读入最后一行匹配不删除
#显示最后两行
sed '$!d'
sed -n '$p'
#输出最后一行
sed -e '$!{h;d;}' -e x
sed -e '1{$q;}' -e '$!{h;d;}' -e x
sed -e '1{$d;}' -e '$!{h;d;}' -e x
#显示倒数第二行
#(1)保存一行到holdspace,删除patternspace直到最后一行,交换
sed -n '/regexp/p'
sed '/regexp/!d'
#显示匹配行
sed -n 'regexp/!p'
sed '/regexp/d'
#不显示匹配行
sed -n '/regexp/{g;1!p;};h'
sed -n '/regexp/{n;p;}'
#显示匹配行的上一行/下一行
#(1)h保证了每一行进入holdspace
Sed-one-line(1) 十月 11th, 2009
sed G
#G是append Hold Space到Pattern Space,Hold Space默认为空,每行后输出一空行
sed '/^$/d;G'
#^$匹配空行,d删除;删除所有空行,在每一行后输出一空行
sed 'G;G'
#输出两空行
sed 'n;d'
#n读入下一行到Pattern Space,并删除;删除所有偶数行
sed '/regex/{x;p;x;}'
#在匹配行,x交换hold space和pattern space,p输出;在匹配行之前插入空行
sed '/regex/G'
#;在匹配行之后插入空行
sed = filename | sed 'N;s/\n/\t/'
#= 在每行之前输出一行行号;
#N添加下一行到pattern space;把换行符替换成tab
sed读入到pattern space的行不包括\n,使用N读入包含\n
#给每一行编号,tab分隔 行号和内容
sed = filename | sed 'N;s/^/ /;s/ *\(.\{6,\}\)\n/\1 /'
#给文件编号,读入下一行,每一行头替换为 (6个空格)
#替换空格(0次)+字符+ \n为字符+空格
#编号,编号右对齐
sed '/./=' filename | sed '/./N;s/\n/ /'
#匹配非空行编号, 匹配非空行读入下一行替换;空行还是占行号
sed -n '$='
#输入最后一行行号;计算行数
#=在pattern space生成行号;
#-n 不输出原文件
sed 's/.$//'
sed 's/^M$//'
sed 's/\x0D$//'
sed "s/$/`echo -e \\\r`/"
sed 's$'"/`echo \\\r`/"
sed "s/$/`echo \\\r`/"
sed 's/$/\r/'
sed 's/^[ \t]*//'
#替换每一行之前的空白(空格和\t)
sed 's/[ \t]*$//'
#替换每一行之后 的空白
sed 's/^[ \t]*//;s/[ \t]*$//'
#替换每一行前后的空白
sed -e :a -e 's/^.\{1,77\}$/ & /;ta'
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'
#: 增加标记 :a标记名为a
#t 跳转到标记 ta
#& 之前匹配的内容
#(1)重复将行的所有内容前后添加一个空格,行右侧有空格
#(2)将文本右对齐,再把空格折半,行右侧无空格
sed 's/^/ /'
#行首替换成5个空格
sed -e :a -e 's/^.\{1,78\}$/ &/ta'
#右对齐