1.文件查看相关命令
(1)cat命令
cat [OPTION]… [FILE]…
-E:显示行结束符
-n:对显示除的每一行进行编号
-A:显示所有控制符
-b:仅对非空行编号
-s:压缩连续的空行成一行
(2)tac命令
倒序显示文件内容
(3)rev命令
rev f2反向显示文件的每一行内容
(4)more命令
分页查看文件
more [OPTION…] FILE…
-d:显示翻页及退出提示
!COMMAND,执行完接着看文档
支持查找等,但是仅能向下查找
(5)less:一页页地查看文件或STDIN输出
查看时有用的命令包括:
/文本 搜索文本
n/N 跳到下一个或上一个匹配项
man命令中使用的分页器也是less
2.显示文本前或后行内容
(1)head命令
head [OPTION]… [FILE]…
-c #:指定获取前#字节
-n #:指定获取前#行
-# :指定行数
(2)tail命令
tail [OPTION]… [FILE]…
-c #:指定获取后#行
-n #:指定获取后#行
-# :指定获取后#行
-f:跟踪显示文件新追加内容,常用于日志监控
logger "this is a log test" :命令logger是触发产生日志的命令
tail -n 0 -f /var/log/messages & 可边工作边动态显示日志变化情况
3.文本抽取和合并命令
(1)cut [OPTION]… [FILE]…
-d DELIMITER:指明分隔符,默认tab
-f FILED:
#:第#个字段
#,#[#]:离散的多个字段,如:1,3,6
#-#:连续的多个字段,例如:1-5
混合使用:1-3,7
-c 按字符切割
–output-delimiter=STRING指定输出分隔符
ifconfig中取
ip:head -2 f2|tail -1 |cut -d ':' -f 2|cut -d ' ' -f 1
CentOS7:ifconfig|head -2|tail -1|cut -d' ' -f 10
取df中磁盘的使用率
df |tr -s ' '|cut -d ' ' -f5|tr -d '%'
df |tr -s ' '|tr ' ' ':'|cut -d':' -f5|tr -d "%"
显示文件或STDIN数据的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd |cut -d: -f7
cut -c2-5 /usr/share/dict/words
(2)paste文本合并命令
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默认用tab
-s:所有行合并成一行
paste f1 f2
paste -s f1 f2
4.分析文本的工具
(1)搜集文本统计数据wc
直接执行wc会显示文件的行数,字符数,单词数
wc -l:显示文件行数
wc -w:显示文件的单词数
wc -c:显示文件的字节数
wc -m:统计字符
(2)文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
sort f2默认排序
cat f1 |sort -n -t:-k3
-n纯数字排序
-r倒序排序
-t指定分隔符
-k指定排序位置
-u删除重复行
(3)uniq命令
从输入中删除重复的前后相接的行
uniq [OPTION]… [FILE]…
-c:显示每行重复的次数
-d:仅显示重复过的行
-u:仅显示不重复的行
在uniq中把连续且完全相同的才认为是重复
常和sort命令一起配合使用:
sort userlist.txt |uniq -c
(4)diff比较文件
比较两个文件之间的区别
diff f1 f2
diff 命令的输出被保存在一种叫做‘补丁’的文件中
使用-u选项来输出‘统一的’diff格式文件,最适用于补丁文件。
patch命令复制在其它文件中进行的改变(要谨慎使用)
适用-b选项来自动备份改变了的文件
diff -u f1 f2 > f.patch
patch -b f1 f.patch
(5)练习:
1、找出ifconfig命令结果中本机的所有IPv4地址
ifconfig|tr -cs '[0-9].' '\n'|sort -ut '.' -k3
2、查出分区空间使用率的最大百分比值
df |tr -s ' '|tr ' ' ':'|cut -d':' -f5|tr -d "%"|sort -n |tail -1
3、查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd|sort -n -t: -k3|tail -1|cut -d: -f1,3,7|tr ':' '\n'
4、查出/tmp的权限,以数字方式显示
stat /tmp|head -4|tail -1|cut -d'(' -f2|cut -d'/' -f1
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
netstat -nt|tr -s ' '|cut -d' ' -f5|sort|uniq -c|cut -d' ' -f 7|sort -n
5.grep文本过滤命令
(1)grep:Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
(2)grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd 这个强引用会使$符号无效
grep `whoami` /etc/passwd
(3)grep命令选项
–color=auto:对匹配到的文本着色显示
-v:显示不能够被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配的行数
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A # :after后#行
-B #:before前#行
-C #:context,前后各#行
-e:实现多个选项之间的逻辑or关系
grep -e 'cat' -e 'dog' file
-w:整行匹配整个单词
-E:使用扩展表达式
grep -E=egrep
6.正则表达式
(1)REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。
程序支持:grep,vim,less,nginx等
分类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E ,egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
元字符分类:字符匹配、匹配次数、位置锚定、分组
获得更多关于正则表达式的信息:man 7 regex
(2)基本正则表达式元字符
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
匹配次数:
用在要指定次数的字符后面,用于指定前面的字符出现的次数
*:匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.*:任意长度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{n\}:匹配前面的字符N次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{,n\}:匹配前面的字符至多n次
\{n,\}:匹配前面的字符至少n次
位置锚定
定位出现的位置
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行
^$:空行
^[[:space:]]*$:空白行
\<或\b:词首锚定,用于单词模式的左侧
\>或\b:词尾锚定;用于单词模式的右侧
\<PATTERN\>:匹配整个单词
分组:
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式的引擎记录于内部的变量中,这些变量的命名方式为
:\1,\2,\3,…
\1:从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\(string\+\(string\)*\)
\1:string\+\(string2\)*
\2:string2
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
示例:~]# grep "^\(.*\b\).*\/\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
相关练习:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
~]# cat /proc/meminfo | grep -i '^S' SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 240 kB Slab: 64448 kB SReclaimable: 38424 kB SUnreclaim: 26024 kB ~]# cat /proc/meminfo | grep -e '^s' -e '^S' SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 240 kB Slab: 64448 kB SReclaimable: 38424 kB SUnreclaim: 26024 kB
2、显示/etc/passwd文件中不以/bin/bash结尾的行
~]# cat /etc/passwd |grep -v '/bin/bash' bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
3、显示用户rpc默认的shell程序
~]# cat /etc/passwd|grep '\brpc\b' |cut -d : -f 7 /sbin/nologin
4、找出/etc/passwd中的两位或三位数
~]# cat /etc/passwd|grep '\b[[0-9][0-9][0-9]\?\b' mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin ~]# cat /etc/passwd|grep '\b[[0-9]\{2,3\}\b' mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
~]# cat /etc/grub2.cfg |grep '^[[:space:]]\+[^[:space:]]' load_env set default="${next_entry}" set next_entry=
6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
~]# netstat -tan|grep 'LISTEN[[:space:]]*' tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 ::1:6010 :::* LISTEN [root@centos7 ~]#
7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
~]# cat /etc/passwd|grep "^\(.*\b\).*/\1$" sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:1003:1005::/home/bash:/bin/bash nologin:x:1006:1008::/home/nologin:/sbin/nologin ~]# cat /etc/passwd|grep -E '^(.*):.*/\1$' sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:1003:1005::/home/bash:/bin/bash nologin:x:1006:1008::/home/nologin:/sbin/nologin
7.egrep及扩展的正则表达式
egrep=grep -E
egrep [OPTIONS] PATERN [FILE…]
扩展正则表达式的元字符
字符匹配:
.:任意单个字符
[]:指定范围的字符
[^]:不在指定范围的字符
次数匹配:
*:匹配前面字符任意次
?:0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定:
^:行首
$:行尾
\<,\b:词首
\>,\b:词尾
分组:
()
后向引用:\1,\2,…
或者:
a|b
C|cat:C或cat
(C|c)at:Cat或cat
练习题:
1、显示三个用户root、mage、wang的UID和默认shell
~]# cat /etc/passwd|grep -E "^(root|mage|wang)"|cut -d: -f3,7 0:/bin/bash 1000:/bin/bash 1009:/bin/bash
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
~]# cat /etc/rc.d/init.d/functions |grep -E '^([[[:alpha:]]+|_])\(\)' checkpid() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { success() { failure() { passed() { warning() { action() { strstr() {
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
~]# echo "/etc/rc.d/init.d/functions" | egrep -o '[^/]+/?$' functions
4、使用egrep取出上面路径的目录名
~]# echo "/etc/rc.d/init.d/functions" | egrep -o '/.*/' /etc/rc.d/init.d/
5、统计以root身份登录的每个远程主机IP地址的登录次数
~]# who |grep "^root"|egrep -o "\(.*\)"|cut -d ')' -f1|cut -d'(' -f2|sort|uniq -c 2 10.1.250.58
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
0-9:[0-9]; 10-99:[1-9][0-9] ; 100-199:1[0-9]{2};200-249:2[0-4][0-9];250-255:25[0-5]
7、显示ifconfig命令结果中所有IPv4地址
~]# ifconfig|egrep -o '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' 10.1.249.36 10.1.255.255 255.255.0.0 127.0.0.1 255.0.0.0
8.sed文本处理工具
Stream EDitor,行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为
“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着
处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出
sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]… 'script' inputfile…
常用选项:
-n:不输出模式空间内的自动打印
-e:多点编辑
-f:/path/to/script_file:从指定文件中读取编辑脚本(文件中写的是2p打印第二行)
-r:支持使用扩展正则表达式
-i:原处编辑(会真正改变源文件)sed -i.bak '2d' f1 删除的时候先备份
script:
‘地址命令’
地址定界:
(1)不给地址:对全文进行处理
(2)单地址:
#:指定的行
/pattern/:被此模式所能够匹配到的每一行
(3)地址范围
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4)~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
d:删除模式空间匹配到的行
p:显示模式空间中的内容
a \text:在行后面的下一行中追加文本;支持使用\n实现多行追加
i \text:在行前面插入文本;支持使用\n实现多行插入
c \text:替换行为单行或多行文本
w /path/to/somefile:保存模式匹配的行至指定文件
r /path/from/somefile:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符号:s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:将替换成功的行保存至文件中
sed命令相关示例:
(1)
~]# sed '2p' /etc/passwd #打印第二行,由于sed本身处理会打印,故第二行打印两次 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
(2)
~]# sed -n '2p' /etc/passwd #-n仅显示匹配到的行,即第二行 bin:x:1:1:bin:/bin:/sbin/nologin
(3)
~]# sed -n '1,4p' /etc/passwd #打印1到第四行 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
(4)
~]# sed -n '/root/p' /etc/passwd #打印行中带root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
(5)
~]# sed -n '2,/root/p' /etc/passwd #打印第二行向后到行中带root的行 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
(6)
~]# sed -n '/^$/=' /etc/fstab #显示空行的行号 1
(7)
~]# sed -n -e '/^$/p' -e '/^$/=' /etc/fstab #一次执行多个操作,用-e分别区分每个操作 1
(8)
~]# sed '/root/a\superman' /etc/passwd #在匹配到的行的下方追加内容 root:x:0:0:root:/root:/bin/bash superman
(9)
~]# sed '/root/i\superman' /etc/passwd #在匹配行的上一行添加 superman root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
(10)
~]# sed '/root/c\superman' /etc/passwd #替换匹配到的行中的内容 superman bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
练习题:
1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
~]# cat /etc/grub2.cfg |sed 's/^[[:space:]]\+//'
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
~]# cat /etc/fstab |sed -r 's@^#[[:space:]]+@@'
3、在/root/install.log每一行行首增加#号
~]# cat /root/install.log|sed 's@^@#@'
4、在/etc/fstab文件中不以#开头的行的行首增加#号
~]# cat /etc/fstab |sed "s@^[^#]@#&@"
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
取目录名:
~]# echo "/etc/" |sed -r "s@(.*/)[[:alnum:]]+/?@\1@"
取基名:
~]# echo "/etc/" |sed -r "s@.*/([[:alnum:]]+/?)@\1@"
6、利用sed 取出ifconfig命令中本机的IPv4地址
~]# ifconfig |sed -n '/Bcast/p'|sed -r 's/.*:(.*) B.*/\1/' 10.1.249.36
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
Packages]# ls | sed -r 's/.*\.([^\.]+)\.rpm/\1/'|sort|uniq -c 1 _1 1 1asfh 1561 i686 1448 noarch 1 TRANS.TBL 3687 x86_64
sed的高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间中取出内容追加到模式空间中
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对
剩余模式空间重新执行sed
sed高级编辑的示例
sed -n 'n;p' FILE #显示偶数行,读第一行后把第二行读入把1覆盖,此时仅剩2,依次类推
sed '1!G;h;$!d' FILE #倒序排列
sed '$!N;$!D' FILE #仅显示最后两行
sed '$!d' FILE #显示最后一行
sed ‘G’ FILE #每行后面加一行空格
sed ‘g’ FILE #把文件中的每行替换为空行
sed ‘/^$/d;G’ FILE #每行后面加一行空格
sed 'n;d' FILE #显示奇数行
sed -n '1!G;h;$p' FILE #倒序显示
原创文章,作者:提着酱油瓶打醋,如若转载,请注明出处:http://www.178linux.com/32335