Linux四剑客-find、awk、grep、sed

目录

awk工具

     awk常用的语句

     awk与其他语句的嵌套用法

     awk的正则用法

sed 工具

grep 工具

find 工具


awk工具:

主要是用于对文件、数据内容进行处理,根据条件、设定的规则完成相应的处理,通常用于匹配文本中指定内容,并且将其打印或者按照用户需求输出结果

#打印文本中需要的某个字段

awk -F" " '{print $6}' jk.txt

【例题】

打印出该服务器的ip

ifconfig  | grep broadcast | awk -F' ' '{print $2}'
ip addr | grep brd | awk 'NR==3 {print $2}'

特别的: NR表示需要打印的行号,NF表示最后一列

  awk常用的语句

#将相同名称后的所有内容配置成一行,且用逗号将前后进行区分

awk  '{a[$1]=a[$1]" "$2} END{for(i in a ) print i","a[i]}'

【示例】
[root@localhost tmp]# cat image.txt 
tfboys karry
tfboys roy
tfboys jackson

[root@localhost tmp]# cat image.txt | awk  '{a[$1]=a[$1]" "$2} END{for(i in a ) print i","a[i]}'
tfboys, karry roy jackson
#实现不同单位行的累加计算,即K、M、G之间的计算

[root@Legion80 ~]# cat 123
75955M
13232K
17492K
75953M
75963M
2G
10G
5T
[root@Legion80 ~]# awk '{a+=/T/?$0*1024:(/M/?$0/1024:(/K/?$0/(1024^2):$0))}END{print a"G"}' 123
5354.56G
[root@Legion80 ~]# awk '{a+=/G/?$0/1024:(/M/?$0/(1024^2):(/K/?$0/(1024^3):$0))}END{print a"T"}' 123
5.22906T
[root@Legion80 ~]# awk '{a+=/T/?$0*(1024^2):(/G/?$0*1024:(/K/?$0/1024:$0))}END{print a"M"}' 123
5.48307e+06M
[root@Legion80 ~]# awk '{a+=/T/?$0*(1024^2):(/G/?$0*1024:(/K/?$0/1024:$0))}END{printf"%.fM\n",a}' 123
5483069M


#另一方案:
#!/bin/bash
total=0
while read LINE
do
   var=$(echo $LINE | tr  -d '[0-9.]')                  # 获取除0-9数字和.外的字符
   num=$(echo $LINE | tr -cd '[0-9.]')                 # 仅需0-9和.
   case $var in
       [Kk]*) total=$(echo "$total + $num * 1024" | bc) ;;              # 匹配k,K
       [Mm]*) total=$(echo "$total + $num * 1024 * 1024" | bc) ;;       # 匹配m,M
       [Gg]*) total=$(echo "$total + $num * 1024 * 1024 * 1024" | bc) ;;# 匹配g,G
           *) total=$(echo "$total + $num" | bc) ;; # 浮点型和整数通过bc来计算
   esac
done < cat 123 
 
echo "total = $total"
#awk求和,第一列相同时,对第二列进行计算

awk '{sum[$2]+=$1/(1024^2)}END{for(c in sum){print sum[c],c}}' 

  awk与其他语句的嵌套用法:

1、与if判断语句进行嵌套使用

#第一个字段大于5,则打印第一第二字段
awk  '{if($1 >= 5) print $1,$2}' file

#第一个字段大于5,则打印第一第三字段
awk '{if($1 >= 5) {print $1,$2} else {print $1,$3}}'

#在进行访问日志排查的时候,经常会遇到500、502这样的错误,需要根据字段进行排查
awk '{if($9 = 500) print $0}' /var/log/nginx/access.log

2、与for循环语句进行嵌套使用

[root@localhost] awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
1
2
3
4
5

3、与while循环语句的嵌套使用

[root@localhost] awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
1
2
3
4
5

4、与do-while循环语句的嵌套使用

[root@localhost] awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
1
2
3
4
5

5、break、continue的嵌套使用

[root@localhost]awk 'BEGIN {
         sum = 0; for (i = 0; i < 20; ++i) { 
         sum += i; if (sum > 50) break; else print "Sum =", sum 
                                      } 
                    }'
 [root@localhost] awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }'

说明:所有的嵌套使用规律其实和其单独使用是一样的,只要熟练使用各个循环语句和判断语句以及awk的使用方法,就可以实现嵌套

awk的正则用法:

https://my.oschina.net/u/2391658/blog/703922

sed 工具:

用于编辑文件,处理文件数据 的,跟 vi 或者 vim 编辑器同一类软件,Sed 是一款非交互式模式 的编辑器,优点:快捷、高效、无需人工交互(交互式命令 fdisk), 用于 shell 编程脚本自动化处理文件中的内容

sed主要是用于替换文本内容,以及对文本内容进行插入,追加,删除

#打印文件的第5行到第10行
sed -n '5,10p' jk.txt

#替换
sed 's/v/V/' jk.txt ->此时并没有替换文件里面的内容,只是内容显示替换
sed 's/v/V/g' jk.txt ->全部替换


要求: 把所有的/ 换成空白 sed -i “s///g” 文件名
[root@jk ~]# sed -i "s/\///g" data
[root@jk ~]# sed -i "s#/##g" data

#"s///g"和"s///"的区别

前一个就是替换所有的,后一个是替换第一个
#sed -n '/起始时间/,/结束时间/p' 日志文件

#sed 查找某个时间范围内所有的日志信息
sed -n '/2019-04-01$19:/,/2019-04-01$21:/p' server_*log.2019-04-01 >> /data/backup/data.txt

#截取指定行数之间的日志
sed -n '开始行数,结束行数p'  待截取的文件  >> 保存的新文件 

grep 工具:

抓取,主要是用于过滤和匹配文件内容,查找文件中是否有匹配关键词,根据用户设定的条件,去完成匹配,最终找出满足条件的内容

[root@fox tmp]# grep "bv" jk.txt -in | cat -n

1 1:dbvjkbcl

2 2:cdjhvcbvls

3 5:bvsaO;JSIF

4 7:ddbvshlfi

搜索时忽略大小写:    grep -i

匹配模式实现匹配当前行的上下几行:

#打印匹配行的前后5行
grep -5 'parttern' file
grep -C 5 'parttern' file

#打印匹配行的前5行
grep -B 5 'parttern' file

#打印匹配行的后5行
grep -A 5 'parttern' file
#关于grep正则匹配,特定字符需要转义
grep '请求接口:views.orgsuju' /data/backup/data.txt | grep '\"orderSource\"\:\"13!9!3!1128!\"' >> /data/backup/test.txt
#匹配某个时间段内的的日志信息
#egrep '2019-04-01\$(19|20|21):'
egrep '2019-04-01\$(19:[3-5]|20:)' /data/logs/server_*log.2019-04-01 >> /data/backup/test.txt


#注意与sed -n的指定范围查询的区别,因为sed的范围查询是指区间内,也就是在匹配到的前一个字段到后一个字段的区间内的所有信息全部打印出来,egrep只是匹配到相关的字符,将其打印出来

过滤时忽略某些目录或文件

https://www.cnblogs.com/pengdonglin137/p/3569218.html

find 工具:

大海捞针,主要是用于查找Linux 操作系统的某个文件、目录所在路径,查找出满足条件的文件或者目录的路径 【和locate命令很相似】

find / -name *.rpm -type d

/:表示是在根目录下进行查找

-type:查找的类型,d是目录,f是普通文件

find / -name *.log -name "an*"

后面的-name是找到.log文件中以con开头的文件

find / -name "con*.log" -exec cp {} /tmp/ \;

基于 find 查找 Linux 系统以.log 结尾,同时名称以 con 开头的,同时将其 拷贝到/tmp 目录下

【例题:】

基于FIND查找Linux操作系统指定目录以.log名称,排除access.log 和error.log,查找10天以前的,查找文件类型而不是目录类型, 日志大小大于20M,小于35M,该日志文件拥有者是root用户, 然后将软件备份到/tmp/;

find / -name "*.log" ! -name "access.log" ! -name "error.log" -mtime -10 -type f -size +20M -size -35M -user root -exec cp {} /tmp/ \;

Grep Sed AWK 对文件内容进行匹配 按照行为单位;FIND 对文 件/目录的名称


参加了一家比较大型公司的面试,第一次进行了上机操作,然后发现,对于大公司而言,基础命令的灵活运用,常见的awk,sed指令的参数要求都很严格。所以对于这四剑客的掌握要非常的灵活,参数也要十分的熟练。面试官跟我说,只有将基础做好才能对上层服务的运行以及架构更加的熟练,否则,一切都是空谈!

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值