三剑客常用方法(持续更新....)

grep

1. grep来提取两个单词之间的文本

     echo "Here is a string" | grep -o -P '(?<=Here).*(?<=string)'


2.  引用外部变量

grep ''$a'' 123    # ---> 双单引号'' xxx''


3.当变量中含有特殊字符需要过滤的时候
 

grep "$a" 123         ---> 双引号“xxx”

sed

sed的参数后的命令,是已单引号开始,单引号结束的,所以想将shell变量拿出来,那就在变量前面加个单引号让sed命令结束,再在变量后面再加个单引号让sed命令再开始

hostname=$1
sed -i 's/HOSTNAME=.*/HOSTNAME='$hostname'/g' /etc/sysconfig/network		
sed -i ''$变量名' s/,//' test.txt


1. eval sed 's/$a/$b/' filename
2.sed "s/$a/$b/" 	filename	
3.sed 's/'$a'/'$b'/' 	filename
4.sed s/$a/$b/ filename

# &为前面(.*)的后向引用
5.ls |grep db_db1_backup_|awk -F 'db_db1_backup_' '{print $2}'|sort |tail -1|sed -r 's/(.*)/db_db1_backup_&/g'  

awk

1. 在函数里面应用

function k(){
        awk -F'[:/]+' '{print $'$1'}' oss_config
}
k 1
k 2
k 3
k 4

三剑客实际应用

 1. 过滤出tcpdump的ip地址并且去重

cat tcp_dump |awk -F ',' '{print $1}' |grep -v '^1'  |awk '{print $1}' |sort -n |uniq -c|egrep  -o "2[0-5].[0-9]{2}.[0-9]{1,3}.[0-9]{1,3}" |sort -n |uniq -c

2. 过滤TLS 错误日志

cat new_55.txt| grep -o -aP  '(?<=row).*(?<=,)' |awk -F '[= ,]+' '{print $2}'|sort -n |uniq -c|awk '{print $2}'

3. 定时任务里面应用

00 09 * * * cd  /opt/adb/adb/fsdc/;/bin/sh /opt/adb/adb/fsdc/increment.sh; /bin/ls -l /opt/adb/adb/fsdc/|/bin/awk -F '_backup_' '{print $2}'|/bin/sort -rn|/bin/head -1|/usr/bin/xargs -i /usr/bin/find /opt/adb/adb/fsdc/ -name *{}|/usr/bin/xargs /usr/bin/basename |/usr/bin/sed -r 's/(.*)/sh &/g'|/usr/bin/bash

awk

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
awk 用法:语法有两种形式
awk [options] ‘script’ var=value file(s)
awk [options] -f scriptfile var=value file(s)

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。

例子:Linux中gsub函数,linux中awk下 gsub函数用法 (相当于SED的功能),Linux中gsub函数
gsub函数则使得在所有正则表达式被匹配的时候都发生替换gsub(regular expression, subsitution string,target string);简称 gsub(r,s,t)

一、遇到的问题:

问题:echo "a b c 2011-11-22 a:d" | awk'$4=gsub(/-/,""Linux中gsub函数
gsub函数则使得在所有正则表达式被匹配的时候都发生替换,$4)'为啥输出后 2011-11-22 变成 2 了?

解答:

gsub(/-/,"",$4)的值是2【在赋值的情况下是这样的~】,你将2赋值给$4 ,gsub返回的是替换的次数。

如下是测试结果:

[root@Test230 ~]# echo "a b c 2011-11-22 a:d" | awk'$4=gsub(/-/,"",$4)'

a b c 2 a:d

看另一种情况,只是替换的话~

[root@sor-sysconfig]# echo "a b c 2011-11-22 a:d" | awk'gsub(/-/,"",$4)'

a b c 20111122 a:d

[root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk'gsub(/-/,"_",$4)'

a b c 2011_11_22 a:d

二。实例详解

下面我们来总结一下这个gsub的用法:

有一个文本文件data.test的内容如下:

0001|20081223efskjfdj|EREADFASDLKJCV

0002|20081208djfksdaa|JDKFJALSDJFsddf

0003|20081208efskjfdj|EREADFASDLKJCV

0004|20081211djfksdaa1234|JDKFJALSDJFsddf

以'|'为分隔,现要将第二个域字母前的数字去掉,其他地方都不变,输出为:

0001|efskjfdj|EREADFASDLKJCV

0002|djfksdaa|JDKFJALSDJFsddf

0003|efskjfdj|EREADFASDLKJCV

0004|djfksdaa1234|JDKFJALSDJFsddf

解法:

awk -F '|' 'BEGIN{ OFS="|" } {sub(/[0-9]+/,"",$2);print$0}'

data.test

awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' data.test

三。sub和gsub的区别

sub匹配第一次出现的符合模式的字符串,相当于 sed 's//' 。

gsub匹配所有的符合模式的字符串,相当于 sed 's//g' 。

例如:

awk '{sub(/Mac/,"Macintosh");print}' urfile 用Macintosh替换Mac

awk '{sub(/Mac/,"MacIntosh",$1); print}' file 第一个域内用

Macintosh替换Mac

把上面sub换成gsub就表示在满足条件得域里面替换所有的字符。

awk的sub函数用法:

sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并

用替换字符串替换这些字符串。

如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配

的时候。格式如下:

sub (regular expression, substitution string):

sub (regular expression, substitution string, target string)

实例:

$ awk '{ sub(/test/, "mytest"); print }' testfile

$ awk '{ sub(/test/, "mytest", $1); print }' testfile

第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。

第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配

发生的时候。

如要在整个文件中进行匹配需要用到gsub

gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

gsub (regular expression, substitution string)

gsub (regular expression, substitution string, target string)

实例:

$ awk '{ gsub(/test/, "mytest"); print }' testfile

$ awk '{ gsub(/test/, "mytest", $1); print }' testfile

第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest

。

另外,只有当记录中的域有改变的时候,指定0FS变量才有用,如果记

录中的域无变化,指定OFS产生不了实际效果。

awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }'

data.txt

将把第三个域中所有数字都去掉。

另外,对于数字的匹配,可以使用十六进制。

awk -F'|' -v OFS='|' '{ gsub(/[/x30-/x39]/, "", $3); print $0; }'

data.txt

awk 实现 数组、if、for 循环使用

[root@k8s-master ~]# echo |awk '{a["x"]=1;a["y"]=2;for (i in a) if (i=="y")  print a[i] }'
2

2. 比较两个文件不一致的方法实现

方法一:comm命令实现

comm命令的参数

-1   不显示只在第1个文件里出现过的列。
-2   不显示只在第2个文件里出现过的列。
-3   不显示只在第1和第2个文件里出现过的列。
comm命令是一个非常简洁的命令,其只有两个参数。不过三个参数也结常要组合使用,我们常用的用法如下:

comm - 12     就只显示在两个文件中都存在的行;
comm - 23    只显示在第一个文件中出现而未在第二个文件中出现的行;
comm - 123  则什么也不显示。
comm找出文件2中有,文件1中没有的行:

cat /etc/dhcpd.conf|grep "fixed-address"|grep -v ^#|awk '{print $NF}'|sed 's/;//g'|sort > /tmp/1.txt
arp -n|grep ether|grep -v eth0|awk '{ print $1}'|sort >/tmp/2.txt
comm -23 2.txt 1.txt
注:两个文件的内容在比较前,一定要进行sort排序。不然输出的结果将是错误的。

方法二:diff命令比较

diff命令是一个比较经典的文本比较工具了,diff命令较comm的参数要多。其经常和patch命令组合使用,进行补丁升级。其默认使用的是-a参数,即逐行比较两个文件之间的不同。此处我们要实现想要得到的结果,还需要配合grep和awk实用:

diff 2.txt 1.txt |grep "<"|awk ' $1 = " " '

注:此处也发现,在使用diff命令进行比较时,也需要预先对经比较的文件进行sort排序,不然输出的结果同样是不正确的。

方法三:awk实现

文件1

[root@ecs-MaxComputer-master01-azxy /opt/test]$ cat 1
3 1
2 2
4 5

文件2

[root@ecs-MaxComputer-master01-azxy /opt/test]$ cat 2
1  1
2  2
3 3
4 5

找到文件2 与1的不同之处:

#【文件1】 与【文件2】 的不同之处:
[root@ecs-MaxComputer-master01-azxy]$ awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' 2 1
3 1
2 2
#【文件2】 与【文件1】 的不同之处
[root@ecs-MaxComputer-master01-azxy]$ awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' 1 2
1  1
2  2
3 3

找出两个文件之间的相同部分可以使用

[root@ecs-MaxComputer-master01-azxy]$ awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' 1 2
4 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值