Linux命令:grep awk sed详解

1、grep

grep [options] regex [file...]

regex 是指一个正则表达式

  • -i : 忽略大小写。不会区分大小写字符。也可用–ignore-case 来指定。
  • -v : 不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会打印不包含匹配项的文本行。也可用–invert-match 来指定。
  • -c : 打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。 也可用–count 选项来指定。
  • -l : 打印包含匹配项的文件名,而不是文本行本身,也可用–files-with-matches 选项来指定。
  • -L : 相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用–files-without-match 来指定。
  • -n : 在每个匹配行之前打印出其位于文件中的相应行号。也可用–line-number 选项来指定。
  • -h : 应用于多文件搜索,不输出文件名。也可用–no-filename 选项来指定。
  • -E : 使用扩展正则表达式 

范例:

# 匹配以 bz 或 gz 或 zip 开头的字符串行
grep -Eh '^(bz|gz|zip)' dirlist*.txt

# 匹配以 以bz开头 或包含 gz 或 包含zip 字符串行
grep -Eh '^bz|gz|zip' dirlist*txt

#特定字符
grep 'a' txt

#范围内字符
grep '[a-z]' txt
grep '[A-Za-z0-9]' txt
grep '[^0-9]' txt 取反,除去数字之外的字符

#任意字符
grep '.' passwd

2、awk

awk '条件 {操作}' 文件
awk '$9 == 500 {print $9, $7}' access.log

awk 的内建变量:

  • $0 当前记录(这个变量中存放着整个行的内容)
  • $1~n 当前记录的第n个字段,字段间由FS分隔
  • FS 输入字段分隔符 默认是空格或Tab
  • NF 当前记录中的字段个数,就是有多少列
  • NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
  • FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
  • RS 输入的记录分隔符, 默认为换行符
  • OFS 输出字段分隔符, 默认也是空格
  • ORS 输出的记录分隔符,默认为换行符
  • FILENAME 当前输入文件的名字

范例:

# 指定 : 为分隔符
awk -F ":" '{print $1, $3, $6}'  xx.txt

# 查看 ett.txt 文件(共 100 行)内第 20 到第 30 行的内容
awk ‘NR>19&&NR<31’ ett.txt
awk ‘{ if (NR>19&&NR<31) print $0}’ ett.txt

#输出第24行并且加行号
awk ‘NR==24 {print NR,$0}’ ett.txt

#以:为分隔符,打印第5列以s开头的一整行
awk -F ":" '$5~/^s/{print $0}' ett.txt

#对csv文件的第2列的倒数300行求和,并将结果保存到csv
awk -F ',' '{L[NR]=$2}END{for(i=NR-299;i<=NR;i++){ sum+=L[i]};{print $0,sum/300}}' test.csv >> min.csv

#返回第一列中类别相同,第三列中最大的行数据
awk '{if($3>a[$1]){a[$1]=$3;b[$1]=$0}}END{for(i in b) print b[i]}' ett.txt

#统计第一列每个类别的占比
awk '{count[$1]++;  if($2>400)above400[$1]++} END{ for(i in count){print i, count[i],above400[i]/count[i]} }'  xxx.txt

3、 sed

sed [options] 'command' file(s)

参数:

-n取消默认输出
-r使用扩展正则
-i刷到磁盘
-e执行多条sed指令
-f指令放在文件里

 sed替换标记:

表2 sed-command
a追加
i插入
d删除
c替换指定的行
s替换每一行匹配的第一个字符
g替换每一行的全部
w另存文件
e执行bash命令
q不继续往下读取
p输出

 

范例:

#在test.txt第一行前插入
sed "1 i This is a test file" test.txt

#test.txt最后一行追加
sed "$ a This is the end of file" test.txt

#删除test.txt第二行
sed "2d" test.txt

#删除test.txt符合正则表达式/fish的行
sed "/fish/d" test.txt

#将text.txt中love替换为like
sed "s/love/like/g" test.txt (/g表示全局匹配)

#输出test.txt的第5-7行
sed -n "5,7p" test.txt (-n的作用就显示出来了,可以去除-n查看效果)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值