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、用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
扩展
- 如何把 /etc/passwd 中用户uid 大于500 的行给打印出来?
- awk中 NR,NF两个变量表示什么含义?awk -F ':' '{print $NR}' /etc/passwd 会打印出什么结果出来?
NR表示行数、NF表示段数。打印出该行对应行数的字段,如第一行就第一个字段,第二行就第二个字段。
- 用grep把1.txt文档中包含'abc'或者‘123’的行过滤出来,并在过滤出来的行前面加上行号.
- grep -v '^$' 1.txt 这样会过滤出哪些行?
过滤掉空行,显示非空行的内容。
- '.' '' 和 '.' 分别表示什么含义?'+'和'?'表示什么含义,这五个符号是否可以在grep中使用,是否可以在egrep、sed以及awk中使用?
.表示任意一个字符,.*表示匹配所有,任意个任意字符,
+表示前面紧邻的那个字符有1个或多个,
?表示前面紧邻的那个字符0个或者1个,可以的。
grep和sed可以使用'.' 、 '' 和 '.',但是不能使用'+'和'?' egrep和awk全部可以使用。
- grep 里面用到一个 {} ,它用在什么情况下?
{ },其内部为数字,表示前面的字符要重复的次数。
数字可以是单个数字{n},也可以是一个区间{n1,n2}。
注意,在字符串中,{ }左右都需要加上脱意字符 ‘\’。
例如, grep 'o{3}' /etc/passwd //输出有3连续的'o'的行
- sed有一个选项,可以直接更改文本文件,是哪个选项?
-i参数,-I参数表示不区分大小写。
8. sed -i 's/.ie//;s/["|&].//' file 这条命令表示什么操作呢?
该命令由;分割了两部分,首先第一部分表示把file中出现的以ie结尾的字符串删除,
第二部分是把file中以"或|或&开头的字符串删除
- 如何删除一个文档中的所有数字或者字母?
删除所有数字: sed -i 's/[0-9]//g' file
删除所有字母: sed -i 's/[a-Z]//g' file
- 截取日志1.log的第一段(以冒号为分隔符), 按数字排序、然后去重,但是需要保留重复的数量如何做?
awk -F ':' '{print $1}' test.txt | sort -n | uniq -c | sort -n
- 使用awk过滤出1.log中第7段(冒号分隔)为'200' 并且第8段为'11897'的行。
awk -F ':' '$7==200 && $8==11897 {print $0}' test.txt
- 请比较这两个命令的异同: grep -v '^[0-9]' 1.txt 和 grep '^[^0-9]' 1.txt
grep -v '^[0-9]' 1.txt //输出文件中不以数字开头的行,但输出空行
grep '^[^0-9]' 1.txt //输出文件中不以数字开头的行,但不输出空行
^以什么开头,需要开头有字符,空行没有字符所有不输出。
- 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,并打印所有的行,此时并不会连带分隔符一起输出
- 使用grep过滤某个关键词时,如何把包含关键词的行连同上面一行打印出来,那下面一行呢?同时上面和下面都打印出来呢?
grep -B1 上面一行
grep -A1 下面一行
grep -C1 上下各一行