cat 是一个文本文件(查看)和(连接)工具,通常与more搭配使用,与more不同的是cat可以合并文件。查看一个文件的内容,用cat比较简单,就是cat后面直接接文件名。
语法
cat [OPTION]... [FILE]...
选项
例子
使用cat查看/etc/fstab,并显示非空行的行号
[root@localhost ~]# cat -b /etc/fstab
1 #
2 # /etc/fstab
3 # Created by anaconda on Wed Jan 15 12:31:47 2020
4 #
5 # Accessible filesystems, by reference, are maintained under '/dev/disk'
6 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
7 #
8 UUID=edcd7459-580f-4622-b6cc-7e8c0893d59f / ext4 defaults 1 1
9 UUID=113bc62d-f6b2-4671-a2cb-e04c4ed04cf6 /boot ext4 defaults 1 2
10 UUID=69b69599-6670-409d-8761-991d44ec3d40 swap swap defaults 0 0
11 /dev/cdrom /media/cd iso9660 auto,ro 0 0
用cat在/tmp目录创建test文件,以hhh作为结束符
[root@localhost tmp]# cat>test< 123
> test
> hh
> hhh
[root@localhost tmp]# cat test
123
test
hh
用cat向test追加内容,以gg作为结束符
[root@localhost tmp]# cat>>test< kkkk
> gg
[root@localhost tmp]# cat test
123
test
hh
kkkk
使用cat连接多个文件
[root@localhost tmp]# cat>tes1< 123
> jkl
[root@localhost tmp]# cat>test2< 456
> jkl
[root@localhost tmp]# cat tes1 test2 > test3
[root@localhost tmp]# cat test3
123
456
more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比;
语法
more [options] file [...]
选项
常用动作指令
我们查看一个内容较大的文件时,要用到more的动作指令,比如ctrl+f(或空格键) 是向下显示一屏,ctrl+b是返回上一屏; Enter键可以向下滚动显示n行,默认为1行;
下面为几个常用的动作指令;
例子
使用more显示/etc/passwd文件,屏幕大小为1,从第2行开始,显示提示
[root@localhost tmp]# more -1 +2 -d /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
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
--More--(9%)[Press space to continue, 'q' to quit.]
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大;您是初学者,我建议您用less。由于less的内容太多,我们把最常用的介绍一下;
语法格式
less [options] file
常用选项
常用的动作命令
进入less后,我们得学几个动作,这样更方便 我们查阅文件内容;最应该记住的命令就是q,这个能让less终止查看文件退出;
就less的动作来说,内容太多了,用的时候查一查man less是最好的。
head 将每个文件的前10行打印到标准输出。如果有多个文件,则在每个文件前面加上给出文件名的头。如果没有文件,或者文件为-,则读取标准输入。
语法
head [OPTION]... [FILE]...
选项
例子
比如我们显示/etc/profile的前10行内容,应该是:
[root@localhost ~]# head -n 10 /etc/profile
tail将每个文件的最后10行打印到标准输出。如果有多个文件,则在每个文件之前加上给出该文件的头
的名字。如果没有文件,或者文件为-,则读取标准输入。
语法
tail [OPTION]... [FILE]...
选项
例子
显示文件 syslog 的后十行内容并在文件内容增加后,且自动显示新增的文件内容。
tail -f /var/log/syslog
使用vi/vim/nano这些文本编辑器也能实现文本查看功能
在目录层次结构中搜索文件
语法
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
-H、-L和-P:用于决定find是如何对待字符链接文件。默认find采取-P选项,不追踪字符链接文件。
-D debugoptions:这个是find的调试模式,当我们执行find后的命令输出,与我们所期望的不同时,使用该选项。
-Olevel:启用查询优化(query optimization)。
上述三种选项,新手都可以忽略,保持其默认即可。简化后的结果为。
find [path...] [expression]
path:表示find查找文件的搜索目录。find只会在给出的目录下查找。可以有多个。
expression:表达式
常用expression
-name “PATTERN” 根据文件名来查找文件,pattern支持globbing字符。
[root@localhost ~]# find /etc -name *tab
/etc/statetab
/etc/fstab
/etc/selinux/targeted/active/modules/100/updfstab
/etc/inittab
/etc/rwtab
/etc/crontab
/etc/anacrontab
/etc/mtab
/etc/crypttab
[root@localhost ~]#
-iname “PATTERN”:类似-name,区别在于该选项是忽略字母大小写。
-size SIZE 根据文件的大小查找
#查找/etc下大于1M的文件
[root@localhost ~]# find /etc -size +1M
/etc/brltty/zh-tw.ctb
/etc/selinux/targeted/active/policy.linked
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
/etc/udev/hwdb.bin
[root@localhost ~]#
-regex PATTERN 正则表达式匹配文件
[root@localhost ~]# find /etc -regex ".*tab"
/etc/statetab
/etc/fstab
/etc/selinux/targeted/active/modules/100/updfstab
/etc/inittab
/etc/rwtab
/etc/crontab
/etc/anacrontab
/etc/mtab
/etc/crypttab
[root@localhost ~]#
-print0 文件名输出到一行中
-exec 对找到的文件调用其他命令处理,它的终止是以“;”为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
#对搜索到的文件进行ls -l
[root@localhost ~]# find /etc -name "*tab" -exec ls -l {} \;
-rw-r--r--. 1 root root 212 Aug 4 2017 /etc/statetab
-rw-r--r--. 1 root root 543 Feb 13 16:20 /etc/fstab
total 20
-rw-------. 1 root root 2142 Feb 6 17:41 cil
-rw-------. 1 root root 10360 Feb 6 17:41 hll
-rw-------. 1 root root 2 Feb 6 17:41 lang_ext
-rw-r--r--. 1 root root 511 Aug 4 2017 /etc/inittab
-rw-r--r--. 1 root root 966 Aug 4 2017 /etc/rwtab
-rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab
-rw-------. 1 root root 541 Aug 3 2017 /etc/anacrontab
lrwxrwxrwx. 1 root root 17 Jan 15 12:31 /etc/mtab -> /proc/self/mounts
-rw-------. 1 root root 0 Jan 15 12:31 /etc/crypttab
-type 根据文件的类型查找
[root@localhost ~]# find /etc/sysconfig/ -type l
/etc/sysconfig/selinux
/etc/sysconfig/network-scripts/ifdown
/etc/sysconfig/network-scripts/ifdown-isdn
/etc/sysconfig/network-scripts/ifup-isdn
/etc/sysconfig/network-scripts/ifup
/etc/sysconfig/grub
-user NAME:根据文件的所有者查找,可以是username,也可以是UID。
[root@localhost ~]# find /home -user alice
/home/alice
/home/alice/.mozilla
/home/alice/.mozilla/plugins
/home/alice/.mozilla/extensions
/home/alice/.bashrc
/home/alice/.bash_logout
/home/alice/.bash_profile
[root@localhost ~]#
-group NAME:根据文件的所有组查找,可以是groupname,也可以是GID。
[root@localhost ~]# find /home -group bobby
/home/bobby
/home/bobby/.mozilla
/home/bobby/.mozilla/plugins
/home/bobby/.mozilla/extensions
/home/bobby/.bashrc
/home/bobby/.bash_logout
/home/bobby/.bash_profile
[root@localhost ~]#
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。
语法
locate [OPTION]... PATTERN...
常用选项
例子:
查找匹配net的文件,显示4行
[root@localhost ~]# locate -l 4 net
/boot/grub2/i386-pc/net.mod
/data/centos7/Packages/dracut-network-033-502.el7.x86_64.rpm
/data/centos7/Packages/glib-networking-2.50.0-1.el7.x86_64.rpm
/data/centos7/Packages/libnetfilter_conntrack-1.0.6-1.el7_3.x86_64.rpm
将每个读数据库的统计信息写入标准输出
[root@localhost ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
10,388 directories
141,958 files
6,898,873 bytes in file names
3,172,981 bytes used to store database
刚创建的文件在更新数据库之前查找,locate会提示找不到,这时可以使用updatedb更新数据库
[root@localhost ~]# touch swm
[root@localhost ~]# locate swm
/usr/share/doc/xorg-x11-proto-devel-2018.4/COPYING-windowswmproto
[root@localhost ~]# updatedb
[root@localhost ~]# locate swm
/root/swm
/usr/share/doc/xorg-x11-proto-devel-2018.4/COPYING-windowswmproto
grep的作用是按行查找字符,输出包含字符的行。
语法
grep [options] 'PATTERN' FILE
常用选项
例子
查找指定进程(第3条结果是grep进程本身,并非真正要找的进程。)
[root@localhost ~]# ps -ef | grep "sshd"
root 1075 1 0 10:49 ? 00:00:00 /usr/sbin/sshd -D
root 1510 1075 0 10:51 ? 00:00:00 sshd: root@pts/0
root 4885 1522 0 16:46 pts/0 00:00:00 grep --color=auto sshd
从文件中读取关键词进行搜索 且显示行号
[root@localhost tmp]# cat test1
da.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost tmp]# cat test2
linux
Redhat
[root@localhost tmp]# cat test1 | grep -nf test2
3:ubuntu linux
5:Redhat
6:linuxmint
[root@localhost tmp]#
从多个文件中查找关键词
[root@localhost tmp]# grep "linux" test1 test2
test1:ubuntu linux
test1:linuxmint
test2:linux
[root@localhost tmp]#
从文件的每一行截取一部分内容
语法
cut OPTION... [FILE]...
选项
例子
使用 : 作为分隔符对/etc/passwd进行切分,并输出字段1
[root@localhost tmp]# cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
...
在1的基础上再输出字段2,并以%作为输出分隔符
cut -d: -f1,2 --output-delimiter='%' /etc/passwd
root%x
bin%x
daemon%x
adm%x
lp%x
sync%x
shutdown%x
halt%x
mail%x
operator%x
games%x
ftp%x
nobody%x
systemd-network%x
dbus%x
polkitd%x
postfix%x
sshd%x
将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。
语法
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F
–files0-from=F
从文件F中以null结尾的名称指定的文件中读取输入;如果F是-则从标准输入中读取名称
常用选项
-n, --numeric-sort 以整数类型比较字段
-r, --reverse 倒置排序的顺序为 由大至小(descending),而非默认的由小至大(ascending)
-t, --field-separator=SEP 使用单个字符SEP作为字段分割字符,取代默认的空白字符。
-k, --key=KEYDEF 通过一个键排序;KEYDEF给出位置和类型
-u, --unique 只有唯一的记录,丢弃所有具有相同键值的记录,只留其中的第一条。
例子
以:为分隔符,通过第3个字段以整数类型进行排序
[root@localhost tmp]# sort -t: -k3 -n /etc/passwd
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
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
...
用于报告或忽略文件中的重复行,一般与sort命令结合使用。
语法
uniq [OPTION]... [INPUT [OUTPUT]]
选项
例子
统计/etc/passwd各种shell的数量
[root@localhost tmp]# cut -d: -f7 /etc/passwd | sort | uniq -c
6 /bin/bash
1 /bin/sync
1 /sbin/halt
44 /sbin/nologin
1 /sbin/shutdown
word counting,单词,字符数,字节数,行数统计
语法
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F
选项
例子
统计进程数
[root@localhost tmp]# ps aux | wc -l
102
tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中,tee命令可以重定向标准输出到多个文件。要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。
语法
tee [OPTION]... [FILE]...
选项
例子
tee与重定向的差别
[root@localhost tmp]# seq 5 > 1.txt
[root@localhost tmp]# cat 1.txt
1
2
3
4
5
[root@localhost tmp]# cat 1.txt > 2.txt
[root@localhost tmp]# cat 1.txt | tee 3.txt
1
2
3
4
5
[root@localhost tmp]# cat 2.txt
1
2
3
4
5
[root@localhost tmp]# cat 3.txt
1
2
3
4
5
将上一个命令的输出每一行作为参数传递给xargs后面的命令,xargs后面的命令默认是echo。
语法
somecommand |xargs -item command
选项
-d 更改分隔符,默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。
[root@localhost tmp]# echo -n "one%two%three" | xargs -d% mkdir
[root@localhost tmp]# ls
one three two
[root@localhost tmp]#
-p 打印出要执行的命令,询问用户是否要执行。
[root@localhost tmp]# echo -n "one two three" | xargs -p touch
touch one two three ?...yes
[root@localhost tmp]# ls
one three two
[root@localhost tmp]#
-t 则是打印出最终要执行的命令,然后直接执行,不需要用户确认
[root@localhost tmp]# echo -n "one two three" | xargs -t touch
touch one two three
[root@localhost tmp]# ls
one three two
[root@localhost tmp]#
-0 由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find
命令有一个特别的参数-print0
,指定输出的文件列表以null
分隔。然后,xargs
命令的-0
参数表示用null
当作分隔符。
[root@localhost tmp]# find . -print0 | xargs -0 ls -l
-rw-r--r--. 1 root root 0 Feb 23 21:15 ./one
-rw-r--r--. 1 root root 0 Feb 23 21:15 ./three
-rw-r--r--. 1 root root 0 Feb 23 21:15 ./two
.:
total 0
-rw-r--r--. 1 root root 0 Feb 23 21:15 one
-rw-r--r--. 1 root root 0 Feb 23 21:15 three
-rw-r--r--. 1 root root 0 Feb 23 21:15 two
./.font-unix:
total 0
./.ICE-unix:
total 0
./.Test-unix:
total 0
./.X11-unix:
total 0
./.XIM-unix:
total 0
[root@localhost tmp]#
-L 如果标准输入包含多行,-L
参数指定多少行作为一个命令行参数。
-n 指定每次将多少项,作为命令行参数。
-I 如果xargs要将命令行参数传给多个命令,可以使用-I参数。
[root@localhost tmp]# echo -n '/etc/fstab:/etc/inittab' | xargs -t -d: -n1 -I{} cp -a {} /tmp
cp -a /etc/fstab /tmp
cp -a /etc/inittab /tmp
[root@localhost tmp]#
–max-procs xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。–max-procs参数指定同时用多少个进程并行执行命令。
合并文件内容
语法
join [OPTION]... FILE1 FILE2
选项
例子
[root@localhost tmp]# cat > test1 < aa 12345
> bb 23456
> cc 58795
> dd 12457
> HH
[root@localhost tmp]# cat > test2 < aa qwert
> bb uiopy
> cc hutfj
> ee hufvb
> HH
[root@localhost tmp]# join test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
[root@localhost tmp]# join -a1 test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
dd 12457
[root@localhost tmp]# join -a2 test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
ee hufvb
[root@localhost tmp]# join -o 1.2,2.2 test1 test2
12345 qwert
23456 uiopy
58795 hutfj
[root@localhost tmp]#
可以用来删除一段文本信息中的某些文字,或者将其进行转换。
语法
tr [OPTION]... SET1 [SET2]
选项
例子
[root@localhost tmp]# echo "abc1235a12bc" | tr 'abc' '<>?'
<>?1235<12>?
[root@localhost tmp]# echo "abc1235a12bc" | tr -c 'abc' '<>?'
abc????a??bc?[root@localhost tmp]# echo "abc1235a12bc" | tr -d 'abc'
123512
st tmp]# join test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
[root@localhost tmp]# join -a1 test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
dd 12457
[root@localhost tmp]# join -a2 test1 test2
aa 12345 qwert
bb 23456 uiopy
cc 58795 hutfj
ee hufvb
[root@localhost tmp]# join -o 1.2,2.2 test1 test2
12345 qwert
23456 uiopy
58795 hutfj
[root@localhost tmp]#
#### tr
可以用来删除一段文本信息中的某些文字,或者将其进行转换。
**语法**
`tr [OPTION]... SET1 [SET2]`
**选项**
- -c, -C, --complement \取代所有不属于第一字符集的字符
- -d, --delete 删除所有属于第一字符集的字符
- -s, --squeeze-repeats 把连续重复的字符以单独一个字符表示
- -t, --truncate-set1 先删除第一字符集较第二字符集多出的字符
**例子**
[root@localhost tmp]# echo “abc1235a12bc” | tr ‘abc’ ‘<>?’
<>?1235<12>?
[root@localhost tmp]# echo “abc1235a12bc” | tr -c ‘abc’ ‘<>?’
abc???a??bc?[root@localhost tmp]# echo “abc1235a12bc” | tr -d ‘abc’
123512
文本处理命令还有功能强大的sed和awk,由于功能强大且复杂,过段时间会另开一篇专门介绍