您的位置:首页 > 运维架构 > Linux

linux命令小记(grep、awk、sed)

2017-11-14 10:11 190 查看

grep

grep 标准

egrep 扩展grep,支持基本和正则,执行效果与grep -E相似

fgrep 快速grep,允许查找字符串而不是一个模式

常用参数

-c 只输出匹配的行的总数(count)

-C 加参数num表示,显示匹配的行,及其前后num行

-d 当参数不是普通文件而是目录时

-f 把要匹配的模式写进一个文件中,然后传给grep

-h 查询多个文件时,不显示文件名

-l 查询多个文件时,只输出包含匹配模式的文件的文件名

-n 显示匹配的行及行号

-s 不显示不存在或无匹配文件等错误信息(silence)

-v 只显示不包含匹配模式的行

实例

grep -c “fa>” file1 表示匹配fa,23fa等,不匹配falv这种形式,输出行数

grep -C 2 “fa>” file1 表示输出匹配行,并输出其前后两行

grep -E “[1-9]+” 或 egrep “[1-9]+” ,表示匹配一个数字或多个数字

grep -f file1 file2 表示将file1作为pattern,用file1每一行为一个模式去匹配file2中每一行,当文件大时,消耗很大

grep -v ‘^$’ file 去除文件file中的空行

grep -rl “eth0” /etc 查看/etc目录中于”eth0”有关的文件的文件名

awk

基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。

三种方式调用

awk [opion] ‘awk_script’ inputfile1 [inputfile2 …]

-F fs 使用fs作为输入记录的字段分隔符,若省略,则使用环境变量IFS的值

-f filename 从filename中读取awk_script

-v var=value 为awk_script设置变量

将awk_script放入脚本并以#!/bin/awk -f作为首行,给脚本执行权限,然后在shell下通过键入脚本名调用

将所有的awk_script插入一个单独脚本文件,然后调用awk -f 脚本文件

awk变量

1)awk内部变量,用于存储awk运行时的各种参数

自动内部变量,不应被赋值和改变的

NF   当前输入字段的字段数
NR   对当前输入文件而已,已经被awk读取过的记录(行)数
FNR   已经被aw读取过的记录总数。 当仅有一个输入文件时,FNR和NR一致
FILENAME   当前输入文件的文件名
ARGC   命令行参数的个数(不包括awk_script, 实际就是输入文件数目加1)
ARGIND   当前被处理的文件在数组ARGV内的索引(实际上ARGV[1]就是第一个输入文件)
举例: awk '{print NR, NF, $0} END {print FILENAME}' input_file


字段变量(01 23…)当awk把当前输入记录分段时,会对这些字段变量赋值。和内部变量类似,在awk运行过程中字段变量的值是动态变化的。不同的是,修改这些字段变量的值是有意义的,被修改的字段值,可以在输出中体现

其他内部变量:可以修改

FS   输入记录的字段分隔符(默认空格和制表符)
OFS   输出记录的字段分隔符(默认是空格)
OFMT   数字的输出格式(默认是%.6g)
RS   输入记录见的分隔符(默认是NEWLINE)
ORS   输出记录见的分隔符(默认是NEWLINE)
ARGV   命令行参数数组
ENVIRON   存储系统当前环境变量值的数组,它的每个成员的索引就是一个环境变量名,而对应的值就是相应环境变量值。 赋值后,新值只在awk_script中有效


2)自定义变量

a)varname=value(不需要提前声明)
b)在表达式中,不带双引号的字符串都被视为变量,如果之前没被赋值,默认值0或空字符串


3)向命令行awk传递变量值

awk 'awk_script' awkvar1=value1 awkvar2=value2 .... inputfile
awkvar可以是awk内置变量或自定义变量
awkvar的值将在awk开始对输入文件的第一条记录应用awk_script前传入。如果在awk_script中已经对某个变量赋值,那么在命令行上传入到该变量的值就会无效。(被覆盖)
在awk脚本中,不能直接使用shell变量。


内置函数

int(x)   qiux的整数部分(int(-3.9)值是-3,int(3.8)值是3)
sqrt(x)   求出x正的平方根值
exp(x)   求x的次方
log(x)   求x的自然对数
sin(x)   求x的sine值
cos(x)   求x的cosine值
atan2(y, x)   求y/x的arctangent值
rand()   得到一个分布在0-1的苏技术,每次执行gawk,rand从相同的seed生成值
srand(x)   设定产生随机数的seed为x,如果在第二次运行awk时,设定相同seed值,会得到相同随机数。 省略引数x,如srand(),则当前日期会被当做seed,得到真正的随机数。
index(in, find)  返回in中,find第一次出现的位置,索引从1开始,如果in中没有find,返回0
length(s)   求出s的字符个数
match(s, r)   返回模式字符串r在s第一次出现的位置,若s不包含r,返回0
sprintf(fmt, exp1, ...)   返回经过fmt格式化后的exp
sub(p, r, t)   在字符串t中寻找符合模式字符串p的最靠前最长的位置,并以字符串r代替最前的p
gsub(p, r, t)   在字符串t中以r代替所有的p
substr(str, st, len)   传回str的zi字符串,其长度为len,从strd位置st开始, len默认从st到结束
split(s, a, fs)   在分隔符fs为分隔符将字符串s分隔成一个awk数组a,并返回a的下表数
tolower(str)   将字符串str的大写字母改为小写字母
toupper(str)   将字符串str的小写字母改为大写字母


实例

awk '{if(index($1,".")<=10){print $0}}' file1 > file2
#output:00003.mb.vmod.cn
#对于file1中的每一行,对第一个参数$1找第一个‘.'的位置,如果小于等于10,则输出这一行

hour1=`date -d "-1 hour" +%H`
hour2=`date -d "-2 hour" +%H`
grep -E "prefix-($hour1|$hour2)" file1 | awk '{print $NF}'
#输出匹配的最后一项

awk '{if(length($1)>5){print $1}}' file1
#输出file1中第一列长度大于5的行的第一列
#如某行 hello! word! 则输出hello!

awk -F '\t' '!a[$1]++' file1
#去重,因为awk是一行一行的处理,比用sort -u要方便快速消耗小
#-F指定了分隔符


sed

sed操作的是一个输入文件在内存的一个副本,对副本内容进行编辑活动,如果没有重定向到一个文件,会将文件修改的结果输出到屏幕。和awk一样,不会修改输入文件的内容。

sed从输入数据中读取一行,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令中指定的定位模式来确定是否编辑和如何编辑。 重复这个过程直至结束。

sed [选项] ‘sed_cmd’ input_file

选项:

-n 默认在讲下一行读入缓冲区前,自动输出缓冲区内容。

-e 如果在命令行调用多条sed_cmd,必须在每天sed_cmd前加’-e’选项

sed_cmd格式: ‘[address] sed_edit_cmd’

address sed的行定位模式,用于只是被编辑的行,省略时编辑所有行

sed_edit_cmd 对被编辑行将要进行的编辑操作

执行sed:

除了直接输入命令行;也可以将sed写入脚本,用sed -f filename 执行;或者直接写sed脚本以“#!/bin/sed -f”开头,通过脚本文件名执行

address定位:

x 行号

x,y 从第x行到第y行

/pattern/ 查询包含模式的行

x,y 查询不包含x和y的行

sed_edit_cmd

p 打印匹配行的行号

= 显示匹配行的行号

a\ 在指定行后附加新文本

i\ 在指定行前插入新文本

d 删除被指定的行

c\ 用新文本替换被定位文本行

s 用模式替换被定位行中的模式

r 从另外一个文件中读入文本附加到指定的行后,并显示读入的文本信息

w 写文本到一个文件

实例

sed 's/\.$//g'  删除已据点结尾的行
sed '/abcd/d'   删除包含abcd的行
sed '   */ /g'  删除多个空格,用一个空格代替
sed '/^$/d'     删除空行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux awk grep sed