awk与sed

      awk

(1).命令格式

有三种方式:

  1.  

    命令行方式:

    awk [ -F 域分隔符 ] ‘commands’ input_file(s)

    域分隔符不指定时缺省为空格,commands是awk命令语句。

  2. awk脚本方式。
  3.  

    awk命令文本方式:

    awk –f awk_script_file input_file(s)

 

(2).awk语句的构成

awk语句都由模式和动作组成。模式决定何时进行操作,动作是操作的具体内容。

模式可以是任何条件语句或复合语句或正则表达式。有两个特殊模式:BEGIN和END。BEGIN在任何文本浏览动作之前,END使用在完成文本浏览之后。

实际动作在{}中指定,简单如打印,复杂的如控制和循环等。

(3).域和记录

awk执行时,其浏览域用$1、$2、…、$n标识,多个域之间用逗号分隔,如$1,$3。

$0标识整个记录(整行)。

(4).awk中的正则表达式

除了基本的元字符外,awk中还可以使用如下两个字符:

+,匹配一个或多个字符;

?,匹配模式出现频率。

(5).awk条件操作符

操作符描述操作符描述
<小于>=大于等于
<=小于等于~匹配正则表达式
==等于!~不匹配正则表达式
!=不等于  

要匹配一个正则表达式,可以使用~后紧跟/正则表达式/,也可使用if语句,if后面的条件用()括起来。

如:

awk '{if ($4 ~ /Brown/) print $0}' grade.txtawk '$4 ~ /Brown/ {print $0}' grade.txt

(6).复合条件操作符

&&:语句两边必须同时匹配为真。

||:语句两边同时或其中一边为真。

!:求逆。

如:

awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txtawk '{if ($4 == "Yellow" || $4 ~ /Brown/) print $0}' grade.txt

(7).awk内置变量

ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEAwk正在浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行-F选项
NF浏览记录的域个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符

访问命令行参数的方法:ARGV[n]。

访问系统环境变量:ENVIRON[ “EDITOR” ] = “vi”。

FNR表示awk目前操作的记录数,其值小于等于NR。

NF表示记录域个数,在记录被读之后设置。

OFS允许指定输出域分隔符,缺省为空格。

ORS允许指定输出记录分隔符,缺省为新行(/n)。

RS为记录分隔符,缺省为新行(/n)。

例:

显示记录个数:

awk 'END {print NR}' grade.txt

文件非空时才操作:

awk '{if (NR > 0 && $4 ~ /Bronw/) print $0}' grade.txt

显示路径中的文件名:

echo “/usr/sybase/etc/rc.file” |awk -F/ '{print $NF}'

(8).awk其他操作符

= += -= *= /= %= ^=赋值操作符
?条件表达操作符
+ - * / % ^算术操作符
++ -- 前缀和后缀

在awk中可以设置变量。如:

awk '{name=$1; belts=$4; /if (belts ~ /Yellow/) print name" is belt "belts}' grade.txt

(9).awk内置字符串函数

gsub(r,s)在整个$0中用s替代r
gsub(r,s,t)在整个t中用s替代r
index(s,t)返回s中字符串t的第一位置
length(s)返回s的长度
match(s,r)测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分成序列a
sprintf(fmt,exp)返回经fmt格式化后的exp
sub(r,s)在$0中用最左边最长的子串s替代r
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分

使用举例:

awk 'gsub(/4842/,4899) {print $0}' grade.txtawk 'BEGIN {print index("Bunny","ny")}' grade.txtawk '$1 == "J.Troli" {print length($1)" "$1}' grade.txtawk 'BEGIN {print length("A good man")}'awk 'BEGIN {print match("ABCD", /d/) }'awk 'BEGIN { print split("123#456#678", myarray, "#"); / print myarray[1]; print myarray[2]; print myarray[3])}'awk "$1 == "J.Troli" {sub(/26/, "29", $0); print $0}' grade.txtawk '$1 == "L.Tanskey" {print substr($1, 1, 5)}' grade.txtawk '{print substr($1, 3)}' grade.txt

(10).字符串屏蔽序列

/b    退格键

/f    走纸换页

/n    新行

/r    回车键

/t    tab键

/ddd  八进制值

/c    任意其他特殊字符,如//为反斜线

(11).awk输出函数printf

基本语法:< P>

printf( [格式控制项],参数)

格式控制类似与c语言中的printf函数。

例如:

awk 'BEGIN { printf "%f/n", 999}'awk 'BEGIN {print "Name/t/tS.Number"} {printf "%-15s %s/n", $1, $3 }'

(12).在命令行向awk传值

格式:

awk 命令变量=输入值。

如:

df -k |awk '($4 ~ /^[0-9]/) / { if ($4 < TRIGGER) print $6"/t"$4}' TRIGGER=5600who |awk '{ if ($1 == user) print $1"connected to "$2}' user=$LOGNAME

(13).awk数组

数组使用前不用定义,一般使用循环来访问数组。格式:

for ( element in array ) print array[element]

 

sed

(1).命令格式

调用sed有三种格式:

  1.  

    命令行格式:

    sed [选项] sed命令 输入文件

  2.  

    使用sed脚本文件:

    sed [选项] –f sed脚本文件 输入文件

  3.  

    可执行sed脚本:

    sed脚本 [选项] 输入文件

    当没有输入文件时,sed从标准输入中接收输入。sed不会对原始输入文件做修改。

 

sed命令要用单引号括起来。

sed选项:

n:不打印,sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。

c:无用。

f:调用脚本文件。

(2).sed定位文本的方式

xx为一行号,如1
x,y表示行号范围从x到y,如2,5
/pattern/查询包含模式的行
/pattern/pattern/查询包含两个模式的行
pattern/,x在给定行号上查询包含模式的行
x,/pattern/通过行号和模式查询匹配行
x,y!查询不包含指定行号x和y的行

sed模式匹配使用正则表达式。

(3).基本sed编辑命令

p打印匹配行
=显示文件行号
a/在定位行号后附加新文本信息
i/在定位行号后插入新文本信息
d删除定位行
c/用新文本替换定位文本
s使用替换模式替换相应模式
r从另一个文件中读文本
w写文本到一个文件
q第一个模式匹配完成后退出或立即退出
l显示与八进制ASCII码等价的控制字符
{}在定位行执行的命令组
n从另一个文件中读文本下一行,并附加在下一行
g将模式2粘贴到/pattern n/
y传送字符
n延续到下一输入行,允许跨行的模式匹配

例如:

显示文本1到3行:

sed -n '1,3p' quote.txt

显示匹配的行:

sed -n '/Neave/p' quote.txt

在第四行查询模式:

sed -n '4,/The/p' quote.txt

匹配元字符(使用反斜线屏蔽含义):

sed -n '//$/p' quote.txt

显示整个文件:

sed -n '1,$p' quote.txt

打印模式匹配的行号:

sed -n '/music/=' quote.txt

删除匹配的文本行:

sed '/Neave/d' quote.txt

写入文件/从文件读:

sed '/Neave/w dht' quote.txtsed '/company/r sedex.txt' quote.txt

匹配后退出:

sed '/.a.*/q' quote.txt

显示文件中控制字符:

sed -n '1,$l' func.txt

(4).附加文本

附加文本的操作格式(附加文本中的/表示换行,最后一行不加/,表示结束):

[address]a/text/text/text

插入文本、修改文本与此类似。

(5).替换文本

格式:

[address[,address]] s/pattern-to_find/replace_pattern/[g p w n]

替换选项:

g,缺省替换第一次出现,使用g替换所有出现。

p,打印。

w 文件名,将输出结果写到文件。

如:

sed -n 's/night/NIGHT/p' quote.txt

附加或修改原匹配模式,可以使用(&)命令,&保存发现模式。

将nurse改为”Hello” nurse:

sed -n 's/nurse/"Hello" &/p' quote.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值