正则扩展练习

grep命令的-P选项:

最典型的用法是,匹配指定字符串之间的字符。 比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符串(my name is) 可以这样写正则表达式。

# echo "Hello, my name is aming."|grep -P '(?<=Hello, ).*(?= aming.)'

如果只需要匹配到的部分,还可以加上-o选项

# echo "Hello, my name is aming."|grep -Po '(?<=Hello, ).*(?= aming.)'

根据这个思路,我们可以去匹配IP地址

# ifconfig eth0 |grep -Po '(?<=addr:).*(?= Bcast)'

打印文件中特定的某行到某行之间的内容:

例如:有个文件test的内容如下:

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

怎么能截取

[abcfd]

123

324

444

[rty]

这一部分出来呢?

#sed -n '/\[abcfd\]/,/\[rty\]/'p test (如果使用-rn 中间的逗号就不会起作用)

扩展:

# sed -n '/03\/Mar\/2016:02:52/,/03\/Mar\/2016:03:03:20/'p /usr/local/nginx/logs/cn.log |awk '{print $1}'|sort|uniq -c|sort -rn //查日志的时候非常有用

sed 如何转换大小写字母:

sed中,使用\u表示大写,\l表示小写

1. 把每个单词的第一个小写字母变大写:(\b后面例子)
# sed 's/\b[a-z]/\u&/g' filename
2. 把所有小写变大写:
# sed 's/[a-z]/\u&/g' filename
3. 大写变小写:
# sed 's/[A-Z]/\l&/g' filename

# sed -n "/abc\b/" file.log              里面这个\b是什么意思呢?

\b 是 boundary(边界) 的意思,表示单词到此结束,能够匹配 abc,但不匹配 abcd 等

打印奇数行或偶数行:

方法1:# sed -n 'p;n' test.txt   #奇数行

# sed -n 'n;p' test.txt   #偶数行

方法2:# sed -n '1~2p' test.txt   #奇数行

# sed -n '2~2p' test.txt   #偶数行

sed在文件中制定以什么开头或结尾的行最后添加一个数字:

#cat test

askdj

aslkd aslkdjf3e

skdjfsdfj

sdkfjk

fsdkfjksdjfkjsdf

12sdfesdf

aslkdjfkasdjf asdlfkjaskdfj

# sed 's/^a.*/& 12/g' test //以a开头的任何行,在其末尾添加 12

askdj 12

aslkd aslkdjf3e 12

skdjfsdfj

sdkfjk

fsdkfjksdjfkjsdf

12sdfesdf

aslkdjfkasdjf asdlfkjaskdfj 12

如何使用sed打印1到100行包含某个字符串的行:

# sed  -n '1,100{/abc/p}'  1.txt

# sed -n '1,100p' /etc/passwd | grep root

位置调换:

把/etc/passwd 复制到/root/password,

把passwd中第一个单词和最后一个单词调换位置:

# sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g' passwd
把passwd中出现的第一个数字和最后一个单词替换位置:

# sed -r 's#([0-9]+):([0-9]+):([^0-9]+):(.*)/([^0-9]+)#\5:\2:\3:\4:\1#g' passwd
把passwd 中第一个数字移动到行末尾:

# sed  -r 's#([0-9]+):([0-9]+):([^0-9]+):(.*)/([^0-9]+)#\2:\3:\4:\5:\1#g' passwd
在passwd 20行到末行最前面加 ‘aaa:’

# sed '20,$s/^/aaa: &/' passwd 

grep 或 egrep 或awk 过滤两个或多个关键词:

# grep -E '123|abc' filename       // 找出文件(filename)中包含123或者包含abc的行

# egrep '123|abc' filename         //用egrep同样可以实现

# awk '/123|abc/' filename       // awk 的实现方式

用awk编写生成以下结构文件的程序:

用awk编写生成以下结构文件的程序。( 最后列使用现在的时间,时间格式为YYYYMMDDHHMISS)  各列的值应如下所示,每增加一行便加1,共500万行。

1,1,0000000001,0000000001,0000000001,0000000001,0000000001,0000000001,2005100110101

2,2,0000000002,0000000002,0000000002,0000000002,0000000002,0000000002,2005100110101
#awk BEGIN{for(i=1;i<=10;i++)printf("%d,%d,%010d,%010d,%010d,%010d,%010d,%010d,%d\n",i,i,i,i,i,i,i,i,strftime("%Y%m%d%H%M"))}'
解释:

%d:直接输出结果

%010d:输出以长度为10位数不足用0补足

strftime()函数的用法:

%Y 年

%m 月份

%d 日期

%H 小时

%M 分钟

strftime()的用法举例如下:

select strftime('%Y.%m.%d %H:%M:%S','now','localtime');

结果:2006.10.17 21:41:09

把两个文件中相同的行合并成一行:

paste  filename1  filename2

这样就可以实现了。举个例子。

cat  a.txt

1 2 3

4 5 6

a b c

cat b.txt

3 2 1

6 5 4

c b a

则  paste  a.txt  b.txt  结果为

1 2 3   3 2 1

4 5 6   6 5 4

a b c   c b a

如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定

paste -d '+'  a.txt b.txt

结果为

1 2 3+3 2 1

4 5 6+6 5 4

a b c+c b a

 /etc/passwd

显示第二行到第五行的行号和整行的内容:

# awk -F ':' 'NR>=2 && NR<=5 {print NR,$0}' /etc/passwd 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
显示从以bin开头的行,到第五行中的行号和整行内容:

[[email protected] awk]# awk -F ':' '/^bin/,NR==5 {print NR,$0}' /etc/passwd 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
从第五列以bin开始的行到以lp开头的行并显示其行号和整行内容:

[[email protected] awk]# awk -F ':' '$5 ~ /^bin/,/^lp/ {print NR,$0}' /etc/passwd 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
统计/etc/servies文件里的空行数量:

[[email protected] awk]# grep "^$" /etc/services | wc -l 
16
[[email protected] awk]# grep -c "^$" /etc/services 
16
取eth0的IP地址:

[[email protected] awk]# # ifconfig ens33 | awk -F "[^0-9.]+" 'NR==2{print $2}'
192.168.197.133

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏deepcc

JavaScript检测IE浏览器(最短代码)

4138
来自专栏mathor

matlab—特殊变量类型与档案存取

这里举个例子,有一个学生structure,包含姓名、邮箱、学号、成绩,应该如何创建这个structure

974
来自专栏Golang语言社区

Golang语言--计算运行的时间

函数time.Since() 计算golang运行的时间是非常有用的性能衡量指标,特别是在并发基准测试中。下面将介绍如何简单地使用Go语言来计算程序运行的时间。...

3588
来自专栏CSDN技术头条

使用Go语言来理解Tensorflow

【译者注】本文通过一个简单的Go绑定实例,让读者一步一步地学习到Tensorflow有关ID、作用域、类型等方面的知识。以下是译文。 Tensorflow并不是...

26710
来自专栏编程

说说正则表达式的使用

今日分享:正则表达式 一:正则表达式的定义及用途 正则表达式是一种特殊的字符串,字符串中的每个字符都含有特定的意义。使用者通过将正则中不同的字符组合成不同的字符...

1968
来自专栏丁科的专栏

pytorch 学习笔记之编写 C 扩展

在之前的文章中,我们已经了解了如何自定义 Module。这篇主要讲解pytorch利用 CFFI 进行 C 语言扩展。包括两个基本的步骤(docs):编写 C ...

9790
来自专栏小白安全

PHP WebShell变形技术总结

简介 WebShell的变形技术与各种防护软件的检测方法一直都在相互对抗,本篇文章就对目前常见的WebShell的变形技术进行总结。 目前的防护...

8007
来自专栏用户2442861的专栏

C++ STL空间配置源码分析以及实现一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1153
来自专栏小白安全

【PHP】WEBSHELL各类变形方法总结

简介 WebShell的变形技术与各种防护软件的检测方法一直都在相互对抗,本篇文章就对目前常见的WebShell的变形技术进行总结。 ...

5477
来自专栏ACM算法日常

石子合并(区间动态规划)- NYOJ 737

有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的...

932

扫码关注云+社区

领取腾讯云代金券