Linux三剑客入门

  • 2019 年 10 月 10 日
  • 筆記

grep文本过滤工具

grep命令是Linux系统中最重要的命令之一,功能是从文本文件管道数据流中筛选匹配的数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

语法:

grep [options] [pattern]  [file]    命令  参数   匹配模式   文件数据

grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式

参数选项

解释说明

-v

排除匹配结果

-n

显示匹配行与行号

-i

不区分大小写

-c

只统计匹配的行数

-E

使用egrep命令

–color=auto

为grep过滤结果添加颜色

-w

只匹配过滤的单词

-o

只输出匹配的内容

案例

cat /etc/passwd > /tmp/test_grep.txt    grep  "login" /tmp/test_grep.txt  -n                #找出login有关行  grep  "login" /tmp/test_grep.txt  -n -v         #找出没有login的行  grep   "ROOT" /tmp/test_grep.txt  -i            #忽略大小写,找出root有关行  grep -E  "root|sync"  /tmp/test_grep.txt --color=auto       #同时过滤出root和sync有关行  grep "login" /tmp/test_grep.txt  -c                 #统计匹配结果的行数  grep "login" /tmp/test_grep.txt   -n -o       #只输出匹配出的内容    grep "oldboy" /tmp/test_grep.txt -w         #完整匹配,字符串精确匹配,整个单词  grep -E "^#|^$"  /tmp/test_grep.txt           #过滤掉空白和注释行 

sed字符流编辑器

注意sed和awk使用单引号,双引号有特殊解释

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。

sed是操作、过滤和转换文本内容的强大工具。常用功能包括对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。

语法:

sed [选项] [sed内置命令字符] [输入文件]

选项:

参数选项

解释

-n

取消默认sed的输出,常与sed内置命令p一起用

-i

直接将修改结果写入文件,不用-i,sed修改的是内存数据

sed的内置命令字符用于对文件进行不同的操作功能,如对文件增删改查

sed常用内置命令字符

sed的内置命令字符

解释

a

append,对文本追加,在指定行后面添加一行/多行文本

d

Delete,删除匹配行

i

insert,表示插入文本,在指定行前添加一行/多行文本

p

Print ,打印匹配行的内容,通常p与-n一起用

s/正则/替换内容/g

匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配

案例:

[root@pylinux tmp]# cat student.txt  1,oldboy,100  2,alex,99  3,wupeiqi,80  4,yuchao,60    #不加-i参数,以下命令都不会写入如文件,仅修改内存数据  sed 'a heiheihei'   student.txt     #匹配每一行,在下一行添加heiheihei  sed '2a heiheihei'   student.txt    #在第二行下面,添加heiheihei  sed '3d'    student.txt                   #删除第三行  sed '2i haha'    student.txt              #在第二行上面,添加haha  sed '2a heihandadada'  student.txt #在第二行下面,添加多行数据  sed '1,2d'  student.txt               #删除1和2行  sed 's/wupeiqi/WUPEIQI/g'    student.txt        #吧wupeiqi换成WUPEIQI  sed 's#wupeiqi#WUPEIQI#g'    student.txt        #效果同上  sed '2p'    student.txt -n                  #打印第二行的内容,sed默认显示所有结果,-n不显示默认输出  sed '1,3p'  student.txt -n            #显示1到3行的内容  sed '11,$d'  student.txt                #删除11行一直到文件结尾

awk基础入门

awk是Linux实际工作中最重要的强大工具.

awk不仅是Linux系统一个命令,也是种编程语言,可以处理数据/文件生成Excel。

语法:

awk [option] 'pattern{action}' file ..  命令 参数           '条件{动作}'  文件..

参数:

参数

解释

-F

指定字段分割

-v

定义或修改awk内部变量

案例:

  • awk的条件 NR表示行号,NR==5表示第五行
  • awk后面内容请使用单引号,双引号有特殊解析
awk 'NR==2,NR==5' test_grep.txt         #显示第2到5行之间的内容

awk '{print NR,$0}' test_grep.txt       #给所有内容加上行号,如同实现cat -n  解释:NR 表示行号,$0表示一整行的内容,print是awk的命令,打印出结果,{print NR,$0}是awk固定语法
awk 'NR==2||NR==6 {print NR,$0}' test_grep.txt      #显示文本的第二行和第六行  awk 'NR==2,NR==6 {print NR,$0}' test_grep.txt           #显示文本的第二行到第六行

awk -F ":" '{print NR,$1,$3,$NF}' test_grep.txt  解释:-F 指定分隔符,以冒号分割  '{print NR,$1,$3,$NF}'  打印出NR行号,$1第一列 $3第三列  $NF最后一列,注意$0表示整行
  • awk的替换查找函数,gsub()
awk '{gsub("bin","BIN",$0);print $0}' test_grep.txt  解释:gsub("想替换的内容","替换后的内容",在一整行都替换;显示替换后的整行结果)
  • 取出网卡的ip地址,注意每台机器的信息不一样
方法一:[root@pylinux tmp]# ifconfig eth0  eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500          inet 10.141.32.137  netmask 255.255.192.0  broadcast 10.141.63.255          ether 52:54:00:4f:ab:36  txqueuelen 1000  (Ethernet)          RX packets 32262057  bytes 4978629753 (4.6 GiB)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 38885574  bytes 7916319323 (7.3 GiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0      ifconfig  eth0| awk -F "inet|netmask"  'NR==2 {print $2}'  解释:因为这里信息左右两边是inet和netmask,因此以它俩分割  显示第二行的结果,第二列的信息    方法二:  [root@pylinux tmp]# ip addr show eth0  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000      link/ether 52:54:00:4f:ab:36 brd ff:ff:ff:ff:ff:ff      inet 10.141.32.137/18 brd 10.141.63.255 scope global eth0         valid_lft forever preferred_lft forever      ip addr show eth0 |awk -F "inet|/18" 'NR==3 {print $2}'  解释:同理    方法三:用不同的分隔符处理  ifconfig eth0|awk -F " " 'NR==2 {print $2}'
  • 搜狐面试题

处理如下文件内容,将域名取出且根据域名计数排序

https://www.baidu.com/index.html  https://sohu.com/index.html  https://sports.sohu.com/index.html  https://sports.sohu.com/index2.html  https://sports.sohu.com/index3.html  http://it.sohu.com/index.html  http://it.sohu.com/index2.html

解法:

awk -F "/" '{print $3}' test_html.txt |sort|uniq -c