系统基础之文件管理工具
linux的重要哲学思想之一,一切皆文件.那作为系统管理员,就要求对文件的操作管理特别熟悉.那么下面介绍的一个工具可以帮助到大家,更有效,快捷的完成对文件的处理.下面让我们来认识以下的工具.
文本工具:
文件内容:
cat: 复制标准输入到标准输出
选项:
-n: 加行号(仅在屏幕显示,不修改文件)
-s: 将所有的连续的多个空行替换为一个空行。
-T: 把文件中的Tab键替换成^I,
cat f1|tr '\t' '\r' > f2(不能对同一个文件操作)
-A: 显示所有文本特殊符号(换行符,空格符)
技巧:
(1)cat > filename 写简单脚本,不用打开文件编写
(2) 合并多个文件
[root@wen-7 ~]# cat -n /etc/issue 1 #\S 2 #Kernel \r on an \m 3 #$hostname 4 #date [root@wen-7 ~]# cat -s abc a a a b d c [root@wen-7 ~]# cat -A /etc/issue #\S$ #Kernel \r on an \m$ #$hostname$ #date [root@wen-7 ~]# cat -T abc ^Ia ^Ia ^I^Ia ^Ib d c [root@wen-7 ~]# cat > file1 echo "Hello World"[root@wen-7 ~]# bash file1 Hello World [root@wen-7 ~]#
tac: cat的倒写 反向显示文件
[root@wen-7 ~]# tac /etc/issue #date #$hostname #Kernel \r on an \m #\S [root@wen-7 ~]# cat /etc/issue #\S #Kernel \r on an \m #$hostname #date [root@wen-7 ~]#
rev: 反向显示文件中每一个行
[root@wen-7 ~]# rev /etc/issue S\# m\ na no r\ lenreK# emantsoh$# etad#
hexdump:查看二进制文件
选项:
-C:显示ascll编码
[root@wen-7 ~]# hexdump /bin/cat 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 0002 003e 0001 0000 2644 0040 0000 0000 [root@wen-7 ~]# hexdump -c /bin/cat 0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000010 002 \0 > \0 001 \0 \0 \0 D & @ \0 \0 \0 \0 \0
more: 翻页查看文件(在显示器上阅读文件的过滤器)
只能向后翻页,到文件底部自动退出
使用:
末行模式,使用!号执行shell命令
[root@wen-7 ~]# more /etc/passwd root:x:0:0:root,123,123,12345:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin m:x:3:4:adm:/var/adm:/sbin/nologin
less:翻页查看文件,可上可下
比more灵活
可搜索关键字,N n切换下一个被模式匹配到的字符
可配合ls管道使用: ls /etc|less
[root@wen-7 ~]# ls /etc/|less [root@wen-7 ~]# less /etc/passwd
head: 显示指定范围的行
-n #: 正数显示文件前#行
-c #: 正数显示#个字节
[root@wen-7 ~]# head -n3 /etc/passwd root:x:0:0:root,123,123,12345:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@wen-7 ~]# head -c4 /etc/passwd root
tail:显示文件后#行
-n #:倒数显示文件第#行
-c #: 倒数显示文件最后#个字节
-f: 显示后不自动退出,自动监控文件更新(日志文件),但占用终端页面
工作需求: 监控日志文件,只显示并报警最新日志,但不影响终端页面,完成其他工作
(1)tail -n 0 -f /var/log/messages & (后端执行) Ctrl+c 退出
[root@wen-7 ~]# tail -n3 /etc/passwd www:x:6012:6017::/home/www:/sbin/nologin user1:x:6013:6013::/home/user1:/bin/bash xing:x:6014:6021::/home/xing:/bin/bash [root@wen-7 ~]# tail -c4 /etc/passwd ash [root@wen-7 ~]# tail -f /var/log/messages #被动监控日志,不能退出文件 Aug 5 20:55:02 wen-7 systemd: Started Session 317 of user pcp. Aug 5 20:55:02 wen-7 systemd: Starting Session 317 of user pcp. Aug 5 20:55:02 wen-7 systemd: Removed slice user-988.slice [root@wen-7 ~]# tail -n 0 -f /var/log/messages & #自动监控日志文件,新条目自动显示 [1] 77572 [root@wen-7 ~]# Aug 5 20:58:47 wen-7 vmsvc[1318]: [ warning] [guestinfo] Failed to get disk info. Aug 5 20:59:17 wen-7 vmsvc[1318]: [ warning] [guestinfo] Failed to get disk info. ^C [root@wen-7 ~]# jobs [1]+ 运行中 tail -n 0 -f /var/log/messages &
文件截取:
cut: [options]..[file]..
-d DELIMIITER:指明分隔符,默认tab
-f FILEDS:
#:指定的单个字段,(第#个字段)
#,#[#]:离散的多个字段.例如1.3.6
#-#:连续的多个字段 例如:1-6
混合使用:1-3,7
例:cut -d:-f1,7 /etc/passwd
cut -d: -f1,3-5,7 /etc/passwd
-c:字符数 例:df -h|cut -c44-46
–output-delimiter= DELIMITER: 指定分隔符替代现有的分隔符,并显示出来
[root@wen-7 ~]# cut -d: -f1 /etc/passwd root bin daemon adm [root@wen-7 ~]# cut -d: -f1,3,7 /etc/passwd root:0:/bin/bash bin:1:/sbin/nologin daemon:2:/sbin/nologin [root@wen-7 ~]# cut -d: -f1,3-5,7 /etc/passwd root:0:0:root,123,123,12345:/bin/bash bin:1:1:bin:/sbin/nologin daemon:2:2:daemon:/sbin/nologin adm:3:4:adm:/sbin/nologin lp:4:7:lp:/sbin/nologin [root@wen-7 ~]# df -h| cut -c44-46 29 0 0
练习;
1.取出ifconfig中的ip
[root@wen-7 ~]# ifconfig eno16777736| head -2|tail -n1|tr -s " "|cut -d" " -f3 172.18.19.219
2.df -h的磁盘利用率
[root@wen-7 ~]# df -h | tail -n5 |tr -s " "| cut -d" " -f5
100%
扩展:
nmap -sP -v 网段 :扫描本网段主机的状态
文件合并:
cat file1 file2 …: 合并多个文件到一列
[root@wen-7 ~]# cat /etc/issue file1 #\S #Kernel \r on an \m #$hostname #date echo "Hello World"[root@wen-7 ~]#
paste: 合并多个文件到一行
默认: paste file1 file2….
-d DELIMIITER :分隔符
-s:每个文件横向输出
[root@wen-7 ~]# paste -d"##" /etc/issue file1 #\S#echo "Hello World" #Kernel \r on an \m# #$hostname# #date# [root@wen-7 ~]# paste -d"##" /etc/issue file1
[root@wen-7 ~]# paste -s /etc/issue file1 #\S #Kernel \r on an \m #$hostname #date echo "Hello World"
文件统计:
wc:统计文本工具
选项:
wc filename: 全部显示 (行数,单词数,字节数,文件名)
-l:lines 行数
-w:words 单词数
-C:bytes 字节数 (汉字占三个字节)
-m:字符数
默认使用命令,输出一段字符串 最后写abc ctrl+d显示统计信息
[root@wen-7 ~]# wc dsfhidh sdafdsif sdfkdls fdsjfhdjk jdsifjksdld kdlsafkld dfdsofjodfjdso a b c 3 10 78
[root@wen-7 ~]# wc file1 0 3 18 file1 [root@wen-7 ~]# wc -l file1 0 file1 [root@wen-7 ~]# wc -w file1 3 file1 [root@wen-7 ~]# wc -c file1 18 file1 [root@wen-7 ~]# wc -m file1 18 file1 [root@wen-7 ~]# cat /etc/issue | wc -l #配合其他命令,用管道连接 4
文件排序:
sort: 排序工具
默认按字母排列方式
-n:基于数值大小而非字符进行排序 配合-k使用
-t CHAR:指定分隔符;
-k #:用于指定排序比较的字段
-r:逆序排序
-f:忽略字符大小写
-u:重复的行只保留一份
重复行:连续且相同
例:
(1)[root@wen-7 ~]# cat /etc/passwd| sort -r -n -t: -k3 排序 (2)root@wen-7 ~]# cat abc 删除重复 a a a b d c [root@wen-7 ~]# cat abc| sort -u a b c d
uniq:移除和报告重复的行
-c:统计重复行的次数
-u:只显示不重复的行
-d:仅显示重复的行
例:
[root@wen-7 ~]#uniq -c abc 4 a 1 b 1 d 1 c
先对文件排序,在统计重复的行,与sort配合使用
例:
[root@wen-7 ~]# cat /etc/init.d/functions |tr -cs '[[:alpha:]]' '\n'| sort | uniq -c|sort -n 51 echo 54 file 55 if 67 pid 94 ] 107 [
文件检查:
diff:逐行比较文件的不同
-u:使用unfied机制,即显示要修改的上下文默认3行
diff /PATH/OLDFILR /PATH/TO/CONF_FILE > /PATH/TO/CONF_FILE
patch:向文件打补丁
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE >/PATH/TO/PATCH_FILE
正则表达式: (Regual Expression REGEXP)
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是表示控制或通配的功能。
分为两类:(元字符不同)
基本正则表达式:BRE
扩展正则表达式:
元字符:不能被整体切割,代表着通配或控制的字符. 对两种表达式的表示不同
grep:
Global search REgular expression and print out the line
作用:文本搜素工具,根据用户指定的模式(过滤条件),对目标文本逐行进行匹配检查, 打印匹配得到的行显示到屏幕
模式:有正则表达式的元字符及文本字符所编写出的过滤条件
正则表达式引擎: 工具不同,引擎不同
grep分类: 支持选项切换
grep:基本正则表达式 -E -F
egrep:扩展正则表达式 -G -F
fgrep:不支持正则表达式
语法:
grep [options] PATTERN [FILE…]
grep [options] [-e PATTERN | -f FILE] [FILE…]
选项:
–color=auto; 对匹配到的字符高亮显示 可以alias定义grep
-i:忽略字符大小写
-o:仅显示匹配到的字符串本身
-v:显示不能被匹配到的行、 取反的意思
-E:支持使用扩展正则表达式元字符
-q:静默模式 不输出任何信息 只关注执行状态返回值
-A #:after,显示被匹配的行的后#行
-B #:before,显示被匹配的行的前#行
-C #:context,显示被匹配的行的前后各#行
-n:显示被匹配到的行号
-c:统计被匹配的行的行数
-e:或, 实现多条表达式共同实行
-w:整行匹配整个单词;
基本正则表达式元字符(basic):
定义:有一类特殊字符集文本多编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能.
程序支持:grep,vim,
字符匹配:
. :匹配任意单个字符 例:r..t
[]: 匹配制定范围内的任意单个字符
[^]:匹配制定范围外的任意单符
[:space:] [:lower:] [:alpha:] [:digit:][:upper:][:punct:][:alnum:]
匹配次数:
用在要指定其出现的次数的字符的后面,用来限制其前面字符出现的次数
默认工作于贪婪模式(能匹配多少就匹配多少),
*:匹配其前面的字符任意次;0,1或多次
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次,即前面的字符也是可有可无的
\+:匹配其前面的字符1次或多次,即前面的字符出现至少1次
\{m}:匹配前面字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次。
\{0.n\}:至多n次
\{m,\}:至少m次。
[root@wen-7 ~]# grep "x\?y" abc bxy xxxxxy yaba aby [root@wen-7 ~]# grep "x*y" abc bxy xxxxxy yaba aby [root@wen-7 ~]# grep "x\+y" abc bxy xxxxxy [root@wen-7 ~]# grep "x.*y" abc bxy xxxxxy [root@wen-7 ~]# grep "x\{1\}y" abc bxy
[root@wen-7 ~]# grep "x\{1,2\}y" abc bxy xxxxxy [root@wen-7 ~]# grep "x\{1,3\}y" abc bxy xxxxxy [root@wen-7 ~]# grep "x\{0,2\}y" abc bxy xxxxxy yaba aby [root@wen-7 ~]# grep "x\{0,5\}y" abc bxy xxxxxy yaba aby [root@wen-7 ~]# grep "x\{3\}y" abc xxxxxy
位置锚点:
^:行首锚定 用于模式的最左侧
$:行尾锚定 用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:空白行
^[[:space:]]*$ 空行或包含空白字符的行
\<或\b:词首锚定
\>或\b:词尾锚定
\<PATTERN>:匹配完整单词
[root@wen-7 ~]# grep ^root /etc/passwd #行首 root:x:0:0:root,123,123,12345:/root:/bin/bash rooter:x:0:6011::/home/rooter:/bin/bash rootkit:x:6015:6022::/home/rootkit:/bin/bash [root@wen-7 ~]# grep "root$" /etc/passwd #行尾 user5:x:6016:6023::/home/user5:/bin/chroot [root@wen-7 ~]# grep "\<root" /etc/passwd #单词首部锚定 root:x:0:0:root,123,123,12345:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooter:x:0:6011::/home/rooter:/bin/bash rootkit:x:6015:6022::/home/rootkit:/bin/bash [root@wen-7 ~]# grep "root\>" /etc/passwd #单词尾部锚定 root:x:0:0:root,123,123,12345:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin user5:x:6016:6023::/home/user5:/bin/chroot [root@wen-7 ~]# grep "\<root\>" /etc/passwd #单词整个锚定 root:x:0:0:root,123,123,12345:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@wen-7 ~]# grep "^$" /etc/rc.d/init.d/functions #空白行 [root@wen-7 ~]# grep "^[[:space:]]*$" /etc/rc.d/init.d/functions #空行或包含空白字符的行
分组及引用:
分组:\(\);将一个或多个字符捆绑在一起,当作一个整体来处理;
例:\(xy\)*ab
向后引用: 引用前面的分组括号中的模式所匹配的字符。
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2: 第二个
\3: 第三个
……
实例: \(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
例:[root@wen-7 ~]# cat abc He loves his lover He likes his lover She likes her liker She lovers her liker [root@wen-7 ~]# cat abc| grep "\(l..e\).*\1" He loves his lover She likes her liker
[root@wen-7 ~]# grep "^\(r..t\).*\1" /etc/passwd root:x:0:0:root,123,123,12345:/root:/bin/bash rooter:x:0:6011::/home/rooter:/bin/bash rootkit:x:6015:6022::/home/rootkit:/bin/bash
练习1:
1.显示/etc/passwd/文件中不以/bin/bash结尾的行;
[root@wen-7 ~]# grep -v "bash$" /etc/passwd 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
2.找出/etc/passwd文件中两为数或三位数
[root@wen-7 ~]# cat /etc/passwd | grep "\<[[:digit:]]\{2,3\}\>" root:x:0:0:root,123,123,12345:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
3.找出/etc/rc.d/init文件中,以至少一个空白字符开头,且后面非空白自的行
[root@wen-7 ~]# cat /etc/rc.d/init.d/functions |grep "^[[:space:]]\+[^[:space:]]" ( /bin/mountpoint -q /cgroup/systemd || /bin/mountpoint -q /sys/fs/cgroup/systemd ) ; then case "$0" in /etc/init.d/*|/etc/rc.d/init.d/*)
4.找出"netstat -tan"命令中的结果以"LISTEN"后跟0,1或多个空白字符结尾的行
[root@wen-7 ~]# netstat -tan| grep "LISTEN[[:space:]]*$" tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 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 额n
egrep:
支持扩展的正则表达式实现类似于grep文本过滤功能:等同于grep -E
语法:egrep [options] PATTREN [file…]
选项:
–color=auto; 对匹配到的字符高亮显示 可以alias定义grep
-i:忽略字符大小写
-o:仅显示匹配到的字符串本身
-v:显示不能被匹配到的行、 取反的意思
-E:支持使用扩展正则表达式元字符
-q:静默模式 不输出任何信息 只关注执行状态返回值
-A #:after,显示被匹配的行的后#行
-B #:before,显示被匹配的行的前#行
-C #:context,显示被匹配的行的前后各#行
-n:显示被匹配到的行号
-c:统计被匹配的行的行数
-e:或, 实现多条表达式共同实行
-w:整行匹配整个单词;
-G:支持基本正则表达式
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配:(不用反斜线的转义,可以去掉反斜号)
*:任意次,0,1或多次;
?:0或1次,其前的字符可有可无;
+:其前字符至少1次;
{m}:其前的字符m次
{m,n}:至少m次,至多n次
{0,n};最多n次
{m,};最少m次
位置锚定:(必须反斜号转义)
^: 行首
$: 行尾
\<,\b 行首锚定
\>,\b 行尾锚定
分组及引用:
分组: ():括号内的模式匹配的字符会被记录正则表达式引擎的内部变量总
后向引用:\1,\2
或:
a|b:a或b
C|cat :C或cat
(c|C)at:cat或Cat
扩展练习:
1.找出/etc/passwd文件中两为数或三位数
[[root@wen-7 ~]# grep -E "\<[0-9]{2,3}" /etc/passwd root:x:0:0:root,123,123,12345:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
2.找出/etc/rc.d/init文件中,以至少一个空白字符开头,且后面非空白自的行 (+代替\+)
[root@wen-7 ~]# cat /etc/rc.d/init.d/functions |egrep "^[[:space:]]+[^[:space:]]" ( /bin/mountpoint -q /cgroup/systemd || /bin/mountpoint -q /sys/fs/cgroup/systemd ) ; then case "$0" in /etc/init.d/*|/etc/rc.d/init.d/*)
3 找出/proc/meminfo文件下,所有以大写或小写S开头的行,至少三种方式
[root@wen-7 ~]# egrep "^(s|S)" /proc/meminfo SwapCached: 40 kB SwapTotal: 2097148 kB [root@wen-7 ~]# egrep -i "^s" /proc/meminfo SwapCached: 40 kB SwapTotal: 2097148 kB [root@wen-7 ~]# grep "^[sS]" /proc/meminfo SwapCached: 40 kB SwapTotal: 2097148 kB
4.显示当前系统上root,centos或use1用户的相关信息
[root@wen-7 ~]# grep -E "^(root|centos|user1)\>" /etc/passwd root:x:0:0:root,123,123,12345:/root:/bin/bash user1:x:6013:6013::/home/user1:/bin/bash
5. 找出/etc/rc.d/init.d/functions文件中某单词(包括下划线)后面跟一个小括号的行
[root@wen-7 ~]# cat /etc/rc.d/init.d/functions | egrep "[[:alnum:]_]+\(\)"
6.使用echo命令输出一绝对路径,使用egrep取出基名
[root@wen-7 ~]# echo "/etc/rc.d/init/" | egrep -o "[^/]+/?$" init/
7.取出ifconfig中1-255的数值
[root@wen-7 ~]# ifconfig | egrep -o "[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]" 167 77 73 6
8.找出/etc/passwd 文件中用户名同shell名的行
[root@wen-7 ~]# cat /etc/passwd | egrep -o "^([^:]+\>).*\1$" sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 位于行首 除:外的单词(词尾锚定) 9.找出/etc/passwd文件中的最后一个单词 [root@wen-7 ~]# cat /etc/passwd | egrep -o "(\<[^/]+$)" bash nologin nologin 除 / 外位于行尾的单词
fgrep:不支持正则表达式元字符
当无需用到元字符去编写模式时,使用fgrep性能更好;
原创文章,作者:wencx,如若转载,请注明出处:http://www.178linux.com/29794