文本查看及处理工具
wc
wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数
语法
wc(选项)(参数)
选项
-c或--bytes或——chars:只显示Bytes数;
-l或——lines:只显示列数;
-w或——words:只显示字数。
参数
文件:需要统计的文件列表
实例
[root@localhost tmp]# cat test
hello world
hello world
hello everyone
[root@localhost tmp]# wc test
3 6 39 test
[root@localhost tmp]# wc -c test
39 test
[root@localhost tmp]# wc -l test
3 test
[root@localhost tmp]# wc -w test
6 test
cut
cut命令用来显示行中的指定部分,删除文件中指定字段
语法
cut(选项)(参数)
选项
-b:仅显示行中指定直接范围的内容;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
参数
文件:指定要进行内容过滤的文件
实例
[root@localhost ~]# cat /tmp/test
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
- 显示第二列内容,第二、四列,前二列,从第二到第四列
[root@localhost ~]# cut -f 2 /tmp/test Name tom jack alex [root@localhost ~]# cut -f 2,4 /tmp/test Name Percent tom 91 jack 87 alex 98 [root@localhost ~]# cut -f -2 /tmp/test No Name 01 tom 02 jack 03 alex [root@localhost ~]# cut -f 2-4 /tmp/test Name Mark Percent tom 69 91 jack 71 87 alex 68 98
- 使用指定分隔符
[root@localhost ~]# cat /tmp/test2 No Name Mark Percent 01 tom 69 91 02 jack 71 87 03 alex 68 98 [root@localhost ~]# cut -f 2 -d " " /tmp/test2 Name tom jack alex
- 显示指定字符,第一个字符,第二到第五个字符,第二和第五个字符
[root@localhost ~]# cut -c 1 /tmp/test2 N 0 0 0 [root@localhost ~]# cut -c 2-5 /tmp/test2 o Na 1 to 2 ja 3 al [root@localhost ~]# cut -c 2,5 /tmp/test2 oa 1o 2a 3l
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
语法
sort(选项)(参数)
选项
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
-k选项的具体语法格式
k选项的语法格式,如下:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。
“如果不设定End部分,那么就认为End被设定为行尾”。
Start部分也由三部分组成,其中的Modifier部分就是类似n和r的选项部分。
其中Start部分的FStart和C.Start:
C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。
参数
文件:指定待排序的文件列表。
实例
[root@localhost ~]# cat /tmp/test3
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
- 默认升序排序
[root@localhost ~]# sort /tmp/test3 aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 eee:50:5.5
- 忽略相同行 -u 等同于 | uniq
[root@localhost ~]# sort -u /tmp/test3 aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5
–选项k实例
[root@localhost ~]# cat /tmp/test3
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
按第一列首字母排列
[root@localhost ~]# sort -t " " -k1 /tmp/test3
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
按第二列数值排序
[root@localhost ~]# sort -n -t " " -k2 /tmp/test3
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
按第二列数值排序,如相同按照第三列数值排序
[root@localhost ~]# sort -n -t " " -k2 -k3 /tmp/test3
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
按第三列数值排序,如相同按第二列数值排降序
[root@localhost ~]# sort -n -t " " -k3 -k2r /tmp/test3
guge 50 3000
sohu 100 4500
google 110 5000
baidu 100 5000
对每一列进行排序时,要按照数值大小进行排序
[root@localhost ~]# sort -t " " -nk3 -nk2r /tmp/test3
guge 50 3000
sohu 100 4500
google 110 5000
baidu 100 5000
从第一列第二个字符进行排序
[root@localhost ~]# sort -t " " -k 1.2 /tmp/test3
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
uniq
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
语法
uniq(选项)(参数)
选项
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
-f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique:仅显示出一次的行列;
-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
参数
- 输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;
- 输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
实例
[root@localhost ~]# cat /tmp/test3
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
baidu 100 6000
google 110 5000
- 统计重复的次数
[root@localhost ~]# sort /tmp/test3 | uniq -c 1 baidu 100 5000 1 baidu 100 6000 2 google 110 5000 1 guge 50 3000 1 sohu 100 4500
- 只显示重复的行
[root@localhost ~]# sort /tmp/test3 | uniq -d google 110 5000
- 显示不重复的行
[root@localhost ~]# sort /tmp/test3 | uniq -u baidu 100 5000 baidu 100 6000 guge 50 3000 sohu 100 4500
diff
diff命令在最简单的情况下,比较给定的两个文件的不同。diff命令是以逐行的方式,比较文本文件的异同处。
语法
diff(选项)(参数)
选项
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
-a或——text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或——paginate:将结果交由pr程序来分页;
-n或——rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-r或——recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或——version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--help:显示帮助;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。
参数
- 文件1:指定要比较的第一个文件;
- 文件2:指定要比较的第二个文件。
实例
[root@localhost ~]# cat /tmp/test3
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
baidu 100 6000
google 110 5000
[root@localhost ~]# cat /tmp/test4
google 200 5000
baidu 100 5000
guge 50 3000
sohu 300 4500
baidu 100 6000
- 比较2个文件不同,normal模式
[root@localhost ~]# diff /tmp/test3 /tmp/test4 1c1 < google 110 5000 --- > google 200 5000 4c4 < sohu 100 4500 --- > sohu 300 4500 6d5 < google 110 5000
diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配
1c1:前面的数字表示第一个文件的第一行,后面的数字表示第二个文件的第一行
操作: a=add c=change d=delete
- 比较2个文件不同,context模式
[root@localhost ~]# diff -c /tmp/test3 /tmp/test4*** /tmp/test3 2018-03-16 11:07:47.034584349 +0800 //***代表test3--- /tmp/test4 2018-03-16 11:36:01.154251821 +0800 //---代表test4*************** //分隔符*** 1,6 **** //test3文件的1-6行! google 110 5000 baidu 100 5000 guge 50 3000! sohu 100 4500 baidu 100 6000- google 110 5000--- 1,5 ---- //! google 200 5000 baidu 100 5000 guge 50 3000! sohu 300 4500 baidu 100 6000操作 !表示修改,-表示删除,+表示增加无论这些符号出现在哪个区域,都表示第一个文件需要做出一些操作才能与第二个文件想匹配。
- 比较2个文件不同,Unified模式
[root@localhost ~]# diff -u /tmp/test3 /tmp/test4--- /tmp/test3 2018-03-16 11:07:47.034584349 +0800+++ /tmp/test4 2018-03-16 11:36:01.154251821 +0800@@ -1,6 +1,5 @@-google 110 5000+google 200 5000 baidu 100 5000 guge 50 3000-sohu 100 4500+sohu 300 4500 baidu 100 6000-google 110 5000
- 目录比较
[root@localhost tmp]# ll test1总用量 8-r--r--r--. 1 root root 33 1月 30 17:28 machine-id-r--r--r--. 1 root root 2207 1月 30 17:28 mtab[root@localhost tmp]# ll testtest总用量 4-r--r--r--. 1 root root 33 1月 30 17:24 machine-id[root@localhost tmp]# diff -r -q test1 testtest只在 test1 存在:mtab
patch
patch 打补丁。通过diff工具生成补丁,patch工具打上补丁。
语法
path(选项)(参数)
选项
-b或--backup 备份每一个原始文件。
-B<备份字首字符串>或--prefix=<备份字首字符串> 设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
-c或--context 把修补数据解译成关联性的差异。
-d<工作目录>或--directory=<工作目录> 设置工作目录。
-D<标示符号>或--ifdef=<标示符号> 用指定的符号把改变的地方标示出来。
-e或--ed 把修补数据解译成ed指令可用的叙述文件。
-E或--remove-empty-files 若修补过后输出的文件其内容是一片空白,则移除该文件。
-f或--force 此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新 版本。
-F<监别列数>或--fuzz<监别列数> 设置监别列数的最大值。
-g<控制数值>或--get=<控制数值> 设置以RSC或SCCS控制修补作业。
-i<修补文件>或--input=<修补文件> 读取指定的修补问家你。
-l或--ignore-whitespace 忽略修补数据与输入数据的跳格,空格字符。
-n或--normal 把修补数据解译成一般性的差异。
-N或--forward 忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。
-o<输出文件>或--output=<输出文件> 设置输出文件的名称,修补过的文件会以该名称存放。
-p<剥离层级>或--strip=<剥离层级> 设置欲剥离几层路径名称。
-f<拒绝文件>或--reject-file=<拒绝文件> 设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
-R或--reverse 假设修补数据是由新旧文件交换位置而产生。
-s或--quiet或--silent 不显示指令执行过程,除非发生错误。
-t或--batch 自动略过错误,不询问任何问题。
-T或--set-time 此参数的效果和指定"-Z"参数类似,但以本地时间为主。
-u或--unified 把修补数据解译成一致化的差异。
-v或--version 显示版本信息。
-V<备份方式>或--version-control=<备份方式> 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串。
-Y<备份字首字符串>或--basename-prefix=--<备份字首字符串> 设置文件备份时,附加在文件基本名称开头的字首字符串。
-z<备份字尾字符串>或--suffix=<备份字尾字符串> 此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
-Z或--set-utc 把修补过的文件更改,存取时间设为UTC。
--backup-if-mismatch 在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
--binary 以二进制模式读写数据,而不通过标准输出设备。
--help 在线帮助。
--nobackup-if-mismatch 在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
--verbose 详细显示指令的执行过程。
参数
- 文件1:需打补丁的文件;
- 文件2:补丁文件。
实例
[root@localhost tmp]# cat /tmp/test2
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
[root@localhost tmp]# cat /tmp/test3
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
baidu 100 6000
google 110 5000
[root@localhost tmp]# diff /tmp/test2 /tmp/test3 > /tmp/test.patch
[root@localhost tmp]# cat test.patch
1,6c1,6
< aaa:10:1.1
< ccc:30:3.3
< ddd:40:4.4
< bbb:20:2.2
< eee:50:5.5
< eee:50:5.5
---
> google 110 5000
> baidu 100 5000
> guge 50 3000
> sohu 100 4500
> baidu 100 6000
> google 110 5000
[root@localhost tmp]# patch -p0 /tmp/test2 /tmp/test.patch
patching file /tmp/test2
[root@localhost tmp]# cat /tmp/test2
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
baidu 100 6000
google 110 5000
综合实例
- 列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
[root@localhost ~]# who root pts/0 2018-03-16 10:51 (10.88.201.253) centos pts/1 2018-03-16 17:16 (10.88.201.53) root pts/2 2018-03-16 17:16 (10.88.201.253) [root@localhost ~]# who | cut -d " " -f 1 | sort -u centos root
- 取出最后登录到当前系统的用户的相关信息。
[root@localhost ~]# last | head -1 | cut -d " " -f 1 | id uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 取出当前系统上被用户当作其默认shell的最多的那个shell。
[root@localhost ~]# cat /etc/passwd | cut -d ":" -f7 | uniq -c | sort -nr | head -1 12 /sbin/nologin
- 将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
[root@localhost ~]# cat /etc/passwd | sort -t: -nk3 | tail -10 | tr "a-z" "A-Z" > /tmp/maxuser.txt [root@localhost ~]# cat /tmp/maxuser.txt NOBODY:X:99:99:NOBODY:/:/SBIN/NOLOGIN SYSTEMD-NETWORK:X:192:192:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN TEST2:X:567:1004::/HOME/TEST2:/BIN/BASH POLKITD:X:998:996:USER FOR POLKITD:/:/SBIN/NOLOGIN SYSTEMD-BUS-PROXY:X:999:997:SYSTEMD BUS PROXY:/:/SBIN/NOLOGIN CENTOS:X:1000:1000::/HOME/CENTOS:/BIN/BASH TEST:X:1001:1001::/HOME/TEST:/BIN/BASH LINUX:X:1002:1003::/HOME/LINUX:/BIN/BASH TESTUSER:X:1003:1002::/HOME/TESTUSER:/BIN/BASH TESTUSERS:X:1004:1001::/HOME/TEST1:/BIN/BASH
- 取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
[root@localhost ~]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.27 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::954a:d872:f506:678b prefixlen 64 scopeid 0x20<link> ether 00:0c:29:52:81:1a txqueuelen 1000 (Ethernet) RX packets 76310 bytes 7928110 (7.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3877 bytes 668914 (653.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@localhost ~]# ifconfig ens33 | grep "\<inet\>" | cut -d " " -f10 192.168.1.27
- 列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
[root@localhost ~]# ls /etc/*.conf | tr "a-z" "A-Z" >/tmp/etc.conf [root@localhost ~]# cat /tmp/etc.conf /ETC/ASOUND.CONF /ETC/DNSMASQ.CONF /ETC/DRACUT.CONF /ETC/E2FSCK.CONF /ETC/FUSE.CONF /ETC/GEOIP.CONF /ETC/HOST.CONF /ETC/KDUMP.CONF /ETC/KRB5.CONF /ETC/LD.SO.CONF /ETC/LIBAUDIT.CONF /ETC/LIBUSER.CONF /ETC/LOCALE.CONF /ETC/LOGROTATE.CONF /ETC/MAN_DB.CONF /ETC/MKE2FS.CONF /ETC/NSSWITCH.CONF /ETC/RESOLV.CONF /ETC/RSYSLOG.CONF /ETC/SESTATUS.CONF /ETC/SUDO.CONF /ETC/SUDO-LDAP.CONF /ETC/SYSCTL.CONF /ETC/TCSD.CONF /ETC/VCONSOLE.CONF /ETC/YUM.CONF
- 显示/var目录下一级子目录或文件的总个数
[root@localhost ~]# ll /var total 8 drwxr-xr-x. 2 root root 6 Nov 5 2016 adm drwxr-xr-x. 6 root root 62 Dec 23 22:04 cache drwxr-xr-x. 2 root root 6 Nov 7 2016 crash drwxr-xr-x. 3 root root 34 Dec 23 22:04 db drwxr-xr-x. 3 root root 18 Dec 23 22:04 empty drwxr-xr-x. 2 root root 6 Nov 5 2016 games drwxr-xr-x. 2 root root 6 Nov 5 2016 gopher drwxr-xr-x. 3 root root 18 Dec 23 22:03 kerberos -rw-r--r--. 1 root root 0 Mar 12 15:22 la5bc drwxr-xr-x. 2 root root 19 Mar 12 15:29 la6bc drwxr-xr-x. 24 root root 4096 Mar 12 14:24 lib drwxr-xr-x. 2 root root 6 Nov 5 2016 local lrwxrwxrwx. 1 root root 11 Dec 23 22:03 lock -> ../run/lock drwxr-xr-x. 7 root root 4096 Mar 12 14:24 log lrwxrwxrwx. 1 root root 10 Dec 23 22:03 mail -> spool/mail drwxr-xr-x. 2 root root 6 Nov 5 2016 nis drwxr-xr-x. 2 root root 6 Nov 5 2016 opt drwxr-xr-x. 2 root root 6 Nov 5 2016 preserve lrwxrwxrwx. 1 root root 6 Dec 23 22:03 run -> ../run drwxr-xr-x. 8 root root 87 Dec 23 22:04 spool drwxrwxrwt. 4 root root 166 Mar 12 14:25 tmp drwxr-xr-x. 2 root root 6 Nov 5 2016 yp [root@localhost ~]# ll /var | grep '[-d]' | wc -l 22
- 取出/etc/group文件中第三个字段数值最小的10个组的名字
[root@localhost ~]# cat /etc/group | sort -t: -nk3 | head -10 | cut -d":" -f 1 root bin daemon sys adm tty disk lp mem kmem
- 将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中
[root@localhost ~]# cat /etc/fstab /etc/issue > /tmp/etc.test [root@localhost ~]# cat /tmp/etc.test # # /etc/fstab # Created by anaconda on Sat Dec 23 22:03:02 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/cl-root / xfs defaults 0 0 UUID=738ad172-a69c-4c16-a207-0bed0add31b5 /boot xfs defaults 0 0 /dev/mapper/cl-swap swap swap defaults 0 0 \S Kernel \r on an \m
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/92649