sed 主要是对行的处理,awk 主要是对列的处理
sed 查找和编辑文本,是一个字符流编辑器,可以很好地完成对多个文件的一系列编辑工作
必须通过行号或正则表达式指定要改变的文本行
执行方式
1、命令行键入命令
2、将sed命令插入脚本文件,然后调用sed
3、将sed命令插入脚本文件,并使sed脚本可执行
选项
n 不打印
p 打印编辑行
c 下一个命令是编辑命令
f 在脚本文件中有sed命令时使用
保存改动的内容到文件,使用重定向
使用sed在文件中定位文本的方式
x x为一行号,如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u /
x , y ! 查询不包含指定行号x和y的行。1 , 2 !
基本sed编辑命令
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息,附加
i\ 在定位行号后插入新文本信息,插入
d 删除定位行,删除
c\ 用新文本替换定位文本,替换
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 全局替换
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
sed识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特
殊字符,必须使用( \)屏蔽其特殊含义
编程举例
sed -n '2p' quote.txt #只打印第二行 -n 显示打印定位行
sed -n '1,3p' quote.txt #打印1-3行
sed -n '/Neave/'p quote.txt #打印匹配单词Neave的行
sed -n '1,/The/'p quote.txt #原意,在第一行查询模式The ,实际未得到预期结果
使用模式和行号进行查询 未成功
sed -n '/\$/'p quote.txt #查询包含$的行,特殊字符前需要使用转义字符'\' 屏蔽其特殊含义
sed -n '3,$p' quote.txt #打印3到最后一行,$为最后一行的意思
sed -n '/.*ing/'p quote.txt #查询以ing结尾的任一单词所在行,.* 任意多个任意字符
sed -n '$p' quote.txt #打印最后一行
sed -e '/music/=' quote.txt #打印所有内容,并在匹配行前一行打印行号。
sed -n '/music/=' quote.txt #只打印匹配行号。= 显示出行号
sed -n -e '/music/p' -e '/music/=' quote.txt #打印匹配行和行号
#!/bin/sed -f #sed命令解释行,在/bin中查找sed以运行命令
/company/ a\ #匹配company ,a\ 附加并换行,即插入新行,以下为新行字符
The suddenly it happened.
但是sed的操作不是在初始文件上的,所以,对于它的添加或修改都不会影响原始文件,
若要想把改过的文件保存,需重定向到一个文件。
#!/bin/sed -f
4 i\ #在第四行上一行插入
The suddenly it happened.
sed '1,$d' quote.txt #删除1到最后一行,原始文件不变,只是显示在屏幕上的字符没有这些行而已
sed '/company/d' quote.txt #匹配删除
sed 's/night/NIGHT/' quote.txt #用NIGHT替换第一个匹配的night
sed 's/night/NIGHT/g' quote.txt #用NIGHT替换全部匹配的night
sed 's/\$//' quote.txt #将字符$删除,因为没有用任何字符来替换
sed -n 's/nurse/"Hello" &/p' quote.txt #修改模式后带 &,将其放在匹配模式之前
sed 's/[0-9][0-9]*/& Passed/g' une.txt #修改模式前带&,将其放在匹配模式之后
可以理解为& 是为匹配模式占位
sed 's/The/Hi!/w sed.out' quote.txt #用Hi!替换The显示替换后的所有文本,
并将修改了的行写入sed.out中,文件名在单引号中,w写
sed '1,2 w send.out' quote.txt #将1,2行内容写入send.out
sed '/good/ w send.out' quote.txt #将匹配行内容写入send.out
sed '/company/r file' quote.txt #将将文件file中的内容插入在匹配行后
sed '/.a.*/q' quote.txt #查询模式首次出现行,并退出
sed -i '/world/s/jint/jjjjjjj/g' test.sh
sed 为从另一个系统中下载的文件剔除控制字符。
产生控制字符(^M)的方法,先按ctrl+v ,然后按Enter
cat dos.txt | sed 's/^0*//g' | sed 's/^M//g'| sed 's/##/ /g'
#将dos.txt文件,删除行首的任意个0,删除控制字符,并用空格替换##
cat a.txt | sed 's/--*//g' \ # '\' 是命令未完,还有下一行
> | sed '/^$/d' | sed '$d' | sed '1d'|awk '{print $1}'
#将a.txt文件,删除--*表示的横线,删除空行^行首、$行尾,删除最后一行,
#删除第一行,打印第一列
echo $NAME | sed "s/go/$REPLACE/g" 要从shell将变量REPLACE的值传入sed,需要使用双引号“”
NEW_NAME=`echo $NAME | sed "s/go/$REPLACE/g"`
#从sed输出中设置shell变量,相当于执行完sed命令,使用执行符 ``
awk
保存awk 输出, 输出重定向符号 > 文件名
~ 模糊匹配
== 精确
awk '{print $0}' grade.txt >wow #在屏幕上输出grade.txt的全部列,并将其写入wow文件中
awk '{print $0}' grade.txt | tee wow #同上
awk 'BEGIN{print"Name\n---------"}{print $1}END{print "end-of reports"}' une.txt
#在屏幕上加入报告头,和信息尾
awk '{if($4~/good/)print $1}' grade.txt #将第四列与good匹配,打印匹配行的第一列
awk '$0 ~ /good/'
awk '$3=="48" {print $0}' grade.txt #精确匹配,只能是48
awk '{if($3~/48/) print $0}' grade.txt #模糊匹配,第三列有48即可
awk 'END {print NR}' grade.txt #查看整个记录的总行数
awk '{print NF,NR,$0}END{print FILENAME}' grade.txt
#NF记录的总列数,NR 行数,$0 全部列,并在结尾处添上 文件名
pwd | awk -F/ '{print $NF}' #将命令pwd的结果处理,—F/ 以 '/' 为列划分方式,NF 打印最后一列
awk 'BEGIN{BASELINE="27"}{if($6<BASELINE)print$0}' grade.txt
#在开始给变量赋值,“27” 和27 一样,然后用变量比较,和直接比较一样
awk '{if($1~"A")$6-2;print$1,$6,$7}' grade.txt
#如果第一列的值匹配A 就将该行的第6列数值减2,打印出第1,6,7行
awk '{if($1=="A"){$6=$6-2};print$1,$6,$7}' grade.txt
awk '{if($1=="A"){$1="AAA"};print$1,$6,$7}' grade.txt
#如果第一列的值等于A 就将该行的第1列的值改为AAA,打印出第1,6,7行
awk '(tot+=$6);END{print "Club student total points:"tot}' grade.txt
#打印所有成绩,同时将第6列的总和打印在结尾
awk '{(tot+=$6)};END{print "Club student total points:"tot}' grade.txt
#加一对花括号{}。将只显示总成绩,即尾句
gsub(/a/,b) 在整个文件中,用b来替换a,替换字符串
awk 'gsub(/a/,b) {print $0}' grade.txt
awk '$1=="A" {print length($1)" "$1}' grade.txt
打印grade.txt中 第一列为A 的行的 第一列的长度 和 第一列
awk 'BEGIN {print match("ANCD",/A/)}' ANCD中是否包含A ,结果是——1,否——0
match("",//) 用来测试目标字符串中是否包含查找字符的一部分
awk 'BEGIN {print index("ANCD","D")}'
index("A","B") 用来查询B在A中第一次出现的位置
awk 'BEGIN {print split("123#456#678",myarray,"#")}'
split("字符串",数组名,"分隔符"); 返回字符串数组元素个数
awk '$1~"A" {print substr($1,2,5)}' grade.txt 打印字符串的第二个字符起长度为5 的字符串
substr("字符串",2,5)
awk 'BEGIN{str="a few goon new"}END{print substr(str,7)}' grade.txt
返回字符串指定位置后面字符。 需要在后面接一个文件名,但文件的内容并没有显示
awk -F: '$1 ~ nihao{print $0}' test.sh
awk -F: '/npp/{print $(NF-1)}' /etc/passwd
echo "65" |awk '{printf "%c\n",$0}'
awk 'BEGIN {printf "%c\n",65}'
awk ' {printf "%-15s %s \n",$1,$3}' grade.txt 格式化输出方式
awk '{if($5<AGE) print $0}' AGE=10 grade.txt 打印第5列的值比变量AGE小的行
#!/bin/awk -f
# name: arraytest
BEGIN{
record="123#456#789";
split(record,myarray,"#")}
END{for(i in myarray){print myarray[i]}}
./arraytest.awk /dev/null 打印数组信息