linux基础,正则,awk

awk命令

截取文档中的第一段awk -F ':' '{print $1}' xx.txt,

awk不会更改原文件的内容,打印所有的段则awk '{print $0}' xx.txt

打印3列,awk -F ':' '{print $1,$2,$3}'

输入图片说明

awk如果没有指定分隔符,默认将会以空格或者空白字符为分隔符去打印

可以使用自定义字符连接打印出来的每个列,默认是以空格为分隔

例:以#为连接字符,awk -F ':' '{print $1 "#" $2"#" $3"#" $4}'

输入图片说明

匹配字符或字符串awk '/oo/' xx.txt

匹配第一列包含字符串oo的行 awk -F ':' '$1 ~ /oo/ ' xx.txt

输入图片说明

打印包含root或者user的行的第一列和第三列

awk -F ':' ' /root/ {print $1,$3} /user {print $1,$3,$4}' passwd

或者 awk -F ':' '/root|user/ {print $0}' passwd

输入图片说明

输入图片说明

多次匹配awk -F ':' '/root/ {print $1,$3};$1~/test/;$3~/20/' xx.txt

输入图片说明

条件操作符== > < != >= <= (一个等号是赋值)

匹配第三字段等于0的行,如果要匹配数字则不加双引号。排序方式不一样

输入图片说明

输入图片说明

输入图片说明

此外可以多个字段进行比较,awk -F ':' '$3<$4 {print $0}' passwd

输入图片说明

定义匹配条件时,也定义打印的分隔符

awk -F ':' '{OFS="#"} $3>1000 || $7=="/bin/bash" {print $1,$2} ' passwd

输入图片说明

输入图片说明

awk内置变量NF(段数)NR(行数)

打印20行以后的行awk 'NR>20' xx.txt

输入图片说明

输入图片说明

习题

1、用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)

输入图片说明

2、查找所有包含 ‘bash’ 的行

输入图片说明

3、用 ‘:’ 作为分隔符,查找第三段等于0的行

输入图片说明

4、用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

输入图片说明

5、用 ‘:’ 作为分隔符,打印最后一段

输入图片说明

6、打印行数大于20的所有行

输入图片说明

7、用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行

输入图片说明

8、用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式'root@/bin/bash‘ )

输入图片说明

9、用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和

输入图片说明

扩展

  1. 如何把 /etc/passwd 中用户uid 大于500 的行给打印出来?

输入图片说明

  1. awk中 NR,NF两个变量表示什么含义?awk -F ':' '{print $NR}' /etc/passwd 会打印出什么结果出来?

NR表示行数、NF表示段数。打印出该行对应行数的字段,如第一行就第一个字段,第二行就第二个字段。

输入图片说明

  1. 用grep把1.txt文档中包含'abc'或者‘123’的行过滤出来,并在过滤出来的行前面加上行号.

输入图片说明

  1. grep -v '^$' 1.txt 这样会过滤出哪些行?

过滤掉空行,显示非空行的内容。

  1. '.' '' 和 '.' 分别表示什么含义?'+'和'?'表示什么含义,这五个符号是否可以在grep中使用,是否可以在egrep、sed以及awk中使用?

.表示任意一个字符,.*表示匹配所有,任意个任意字符,

+表示前面紧邻的那个字符有1个或多个,

?表示前面紧邻的那个字符0个或者1个,可以的。

grep和sed可以使用'.' 、 '' 和 '.',但是不能使用'+'和'?' egrep和awk全部可以使用。

  1. grep 里面用到一个 {} ,它用在什么情况下?

{ },其内部为数字,表示前面的字符要重复的次数。

数字可以是单个数字{n},也可以是一个区间{n1,n2}。

注意,在字符串中,{ }左右都需要加上脱意字符 ‘\’。

例如, grep 'o{3}' /etc/passwd //输出有3连续的'o'的行

  1. sed有一个选项,可以直接更改文本文件,是哪个选项?

-i参数,-I参数表示不区分大小写。

8. sed -i 's/.ie//;s/["|&].//' file 这条命令表示什么操作呢?

该命令由;分割了两部分,首先第一部分表示把file中出现的以ie结尾的字符串删除,

第二部分是把file中以"或|或&开头的字符串删除

  1. 如何删除一个文档中的所有数字或者字母?

删除所有数字: sed -i 's/[0-9]//g' file

删除所有字母: sed -i 's/[a-Z]//g' file

输入图片说明

输入图片说明

  1. 截取日志1.log的第一段(以冒号为分隔符), 按数字排序、然后去重,但是需要保留重复的数量如何做?

awk -F ':' '{print $1}' test.txt | sort -n | uniq -c | sort -n

输入图片说明

  1. 使用awk过滤出1.log中第7段(冒号分隔)为'200' 并且第8段为'11897'的行。

awk -F ':' '$7==200 && $8==11897 {print $0}' test.txt

输入图片说明

  1. 请比较这两个命令的异同: grep -v '^[0-9]' 1.txt 和 grep '^[^0-9]' 1.txt

grep -v '^[0-9]' 1.txt //输出文件中不以数字开头的行,但输出空行

grep '^[^0-9]' 1.txt //输出文件中不以数字开头的行,但不输出空行

^以什么开头,需要开头有字符,空行没有字符所有不输出。

  1. awk中的$0表示什么?为什么以下两条命令的$0结果不一致呢? awk -F ':' '{print $0}' 1.txt 和 awk -F ':' '$7=1 {print $0}' 1.txt

$0表示打印所有行,

awk -F ':' '{print $0}' 1.txt //表示打印所有行

awk -F ':' '$7=1 {print $0}' 1.txt //以冒号为分隔符,输出时将每行的第七段的内容更改为1,并打印所有的行,此时并不会连带分隔符一起输出

  1. 使用grep过滤某个关键词时,如何把包含关键词的行连同上面一行打印出来,那下面一行呢?同时上面和下面都打印出来呢?

grep -B1 上面一行

grep -A1 下面一行

grep -C1 上下各一行

转载于:https://my.oschina.net/u/3363383/blog/1576415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值