Linux系统介绍(五)常用命令

2017-11-20  本文已影响0人  keysaim

cat命令

很多时候我们通过cat命令来查看文件内容,它会将文件的所有内容显示出来。当然,cat也可以通过管道接收数据,它主要完成的是将从管道接收的输入导到输出。

more跟less命令

有时候用cat命令来显示一个较大的文件并不方便,整个文件内容一次性显示出来简直就是刷屏了。如果需要一页页的显示内容,可以使用more或者less命令,这两个命令会以分页的形式显示文件内容,至于使用哪个命令完全看个人习惯了。此外,这两个命令不仅可以分页显示,而且在分页模式下,你可以用快捷键方便的浏览及搜索:

* 按`d`下翻页
* 按空格下翻页
* 按回车下移一行
* 按`/`进入搜索模式,输入要搜索的关键字,按回车搜索。
* 按`n`搜索下一个
* 按`q`退出查看

tee命令

tee命令一般从管道接收数据,这点与cat类似,将stdin导到stdout。不同的是,tee同时还可以指定一个文件作为输出。这点非常有用,有时候我们想一般看到命令的输出,同时又希望将输出保存到文件中,这时候用tee最为合适。

# date | tee time.log
Mon Nov 20 14:05:02 EST 2017
# cat time.log
Mon Nov 20 14:05:02 EST 2017

date命令

date命令用来显示时间跟时区,比较常见的用法有:

cal命令

我们用date可以显示时间,同时咱们还可以通过cal命令来显示日历:

# cal
    November 2017
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

当然,你也可以指定要显示的日期,比如1949年10月的日历:

# cal 10 1949
    October 1949
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

time命令

有时候我们需要知道一个命令运行了多少时间,这时候我们可以用time命令来计时:

# time sleep 1

real    0m1.018s
user    0m0.001s
sys     0m0.002s

其中sleep 1用来睡眠1秒,real表示实际用了多少时间,user表示在用户态花了多少时间,sys则表示在内核花了多少时间。详细可以参考这篇问答

wc命令

wc命令是Word Count的简称,顾名思义就是用来统计单词的。

# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | wc -w
14

参数-w表示统计单词数,这里的单词实际上指的是被空格分开的字符串。下面列举出wc命令的有关参数:

参数 说明
-w 统计多少单词
-l 统计多少行
-c 统计有多少个字节
-m 统计有多少个字符
-L 统计长度最长的行的长度

注意,这里的字节跟字符的差别,在英文中基本上是一样的,但是在多字节语言中,其意义就不一样了:

# echo '你好' | wc -c
7
# echo '你好' | wc -m
3

find命令

find命令用来查找文件或目录,这又是一个非常强大的且常用的命令,这里只介绍几种常见的用法:

参数 说明
-mtime 根据修改时间,也就是ls -l显示的时间
-atime 根据访问时间,也就是ls -lu显示的时间
-ctime 根据状态改变的时间,也就是ls -lc显示的时间

时间值的表示说明:基准+0表示一天前,-1.5表示最近1.5天,+1.5表示2.5天前

逻辑 参数 说明
-a -and的缩写,逻辑与的关系,如find . -type f -a -name "*.log"
-o -or的缩写,逻辑或的关系, 如find . -name "*.cpp" -o -name "*.h"
! -not的缩写,逻辑非的关系, 如find . ! -name "*.cpp"

此外,find命令还有一个非常重要且常见的用法,就是在找到文件后执行某个命令,改用法如下:

find . -name "*.log" -exec rm {} \;

表示删除当前目录包括子目录中以.log为后缀的所有文件。其中,-exec表示在找到后需要执行命令,而命令为rm {} \;,实际上此命令就是一般的shell命令,其中{}用来指代找到的文件或目录,这里;必须转义,因为需要传递给find本身,如果不转义,则会直接被shell解析使用了。每找到一个文件或目录,都会执行指定的命令,其中{}部分以文件路径替代。如果需要只执行一次命令,而把所有找到的文件作为参数传递给该命令,则需要用+替代\;,如:

find . -name "*.log" -exec rm {} +

假定找到的文件有test.logtest1.log,用\;的方式相当于执行两次:rm test.logrm test1.log;如果使用+则只有一次命令rm test.log test1.log

sort命令

顾名思义,这个命令就是用来排序的。

# head -n 5 /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

默认情况下,sort命令以字典顺序对每行进行排序,如果不带参数,会将整行作为一个字符串进行比较。当然,你也可以指定以第几列进行排序:

# head -n 5 /etc/passwd | tr : " " | sort -k 3
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

这里先将:换成空格(关于tr命令,请参照本文关于tr命令的章节),然后以-k为参数,指定以第三列进行排序。下面列举其常用的一些参数:

参数 说明
-k 以第几列排序,列以空格为分隔
-r 默认sort以升序输出,-r参数则可以以降序输出
-n 在指定第几列的时候,可以强制sort把列的值以数字值进行排序,如下面的例子
-t 默认情况下认为列是以空格为分隔,-t参数则可以指定分隔符,这样,上面的例子其实可以直接写成sort -t : -k 3
-f 忽略大小写
-u 如果排序后出现重复的行,加上这个参数将只显示一行
# cat test2
10
3
5
3
# cat test2 | sort
10
3
3
5
# cat test2 | sort -n
3
3
5
10
# cat test2 | sort -n -u
3
5
10

uniq命令

uniqunique的简写,用来消除sort排序后重复的行,即相当于sort命令中的-u参数。但是,uniq不仅可以消除重复行,它还可以显示分别重复了多少行:

# cat test2 | sort -n | uniq -c
      2 3
      1 5
      1 10

还有些常用的参数如下:

参数 说明
-i 忽略大小写
-d 只打印有重复的行,每组一个,如果要打印组内所有的,则用-D
-u 只打印没有重复的行
-f 比较的时候,忽略前面的N列
-s 比较的时候,忽略前面的N个字符

od命令

od可以用来显示二进制文件:

# cat test2
abcdefg
1234567
# od -t x1 test2
0000000 61 62 63 64 65 66 67 0a 31 32 33 34 35 36 37 0a
0000020

当然,也可以直接显示字符:

# od -c test2
0000000   a   b   c   d   e   f   g  \n   1   2   3   4   5   6   7  \n
0000020

当然,如果仅仅只是显示二进制内容,还可以使用hexdump命令了。

压缩类命令

tar命令

在Linux中,用的最多的压缩命令就是tar命令了,在介绍其用法之前,需要清楚几个概念:

下面来详细介绍tar命令的用法,tar的用法如下:

# tar --help
Usage: tar [OPTION...] [FILE]...

tar命令支持非常多的参数,这里列举比较常用的几种使用方式:

需要注意的是,tar支持不同的压缩格式,除了gzip之外,还有:

参数 说明
j 采用bzip2的压缩格式,文件后缀通常为.bz2
--lzip 采用lzip的压缩格式,文件后缀通常为.lz
--xz 采用xz的压缩格式,文件后缀通常为.xz
--lzma 采用lzma的压缩格式,文件后缀通常为.lzma

更多格式可以参考这里。当然,最为常用的两种格式为gzipbzip2,用法示例如下:

 tar czvf tmp.tgz tmp/
 tar cjvf tmp.bz2 tmp/

其中v参数可选,如果不需要显示压缩过程的话。需要注意的是,tar压缩目录的时候会保持目录的结构。

split命令

split命令用来将一个文件分成多个文件,比如将一个特别大的文件分成平均大小为100M的多个文件等。

# split -b 40M go1.6.linux-amd64.tar.gz go1.6.linux-amd64.tar.gz.part
# ll go1.6.linux-amd64.tar.gz.part*
-rw-r--r--. 1 root root 41943040 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partaa
-rw-r--r--. 1 root root 41943040 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partab
-rw-r--r--. 1 root root   913400 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partac

其中,go1.6.linux-amd64.tar.gz是要被拆分的文件,go1.6.linux-amd64.tar.gz.part是拆分后文件的前缀,可以看到文件被拆分为三部分了。

split非常常见的用法是来将某个被压缩的文件拆分成小的部分,正如上例所示。那么,如何将拆分的文件重新合并呢?我们可以用cat将它们合并:

cat go1.6.linux-amd64.tar.gz.part* > go1.6.linux-amd64.tar.gz

grep命令

过滤数据来说,用的最多的估计就是grep命令了,grep命令可以从文件或者管道中搜索数据并打印出来,当然,其也可以直接在目录中搜索所有的文件,并把其中符合条件的行打印出来。

# cat test.log | grep hello
hello
# grep hello test.log
hello
# grep hello . -r
./test.log:hello

上面就是三种方式搜索包括hello关键字的行。

grep是Linux中使用最为频繁的命令之一,其本身也有非常强大的功能,这一节咱们将详细讲述其比较常见的用法。

基本查找

查看grep的帮助可以看到:

# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...

其中OPTION指的是命令参数,PATTERN指的是匹配的字符串,比如关键字搜索。FILE指的是文件,当然,没有文件的时候也可以通过管道接收数据并搜索过滤。grep提供了非常多的命令参数用来控制查找的方式跟效果,下面列举其常用的一些参数:

参数 说明
-i 默认情况下,grep命令的搜索是大小写敏感的,如果需要忽略大小写可以用这个参数
-v 该参数表示不包含的意思
-A2 其中Aafter的意思,表示同时显示搜索出来行后面两行。有时候我们需要知道匹配行后面是什么,可以用这个参数
-B2 A相反,其是before的意思,表示同时显示匹配行前两行
-C2 有时候我们想既显示前面两行也显示后面两行,这时候就用这个参数
-r 搜索目录的时候需要带上这个参数
-n 有些时候,我们需要知道匹配到的行是第几行,可以加上这个参数把行号打印出来

对于PATTERNgrep命令也支持不同的用法:

这个是最常用的基本用法,匹配是否包括该关键字的行。

除了基本的关键字匹配,grep还支持极为强大的正则表达式的匹配。我们将在下一小节专门讲述正则表达式匹配。

有时候我们需要匹配某个PATTERN1或者PATTERN2的行,这时候可以这么写PATTERNPATTERN1\|PATTERN2。通过\|将多个PATTERN连在一起表示或的意思,只要匹配其中任一个的行都会被打印出来。

# grep '12306\|test' . -r
./test2:http://abcdefg.test.com
./test2:12306.com

正则表达式匹配

grep命令支持非常强大的正则匹配,支持三种不同的正则表达式:

当然,比较常用的是ERE正则表达式了。在grep命令中,采用-E参数即可以使用该表达式,正则表达式非常灵活,用法非常多,这里列举几个示例:

当然,如果需要熟练掌握grep的正则表达式匹配,你必须对正则表达式非常熟悉,这个就不在本篇的范畴了。

awk命令

要说Linux中最为强大的基本命令有哪些,那awk无疑会榜上有名,其强大的流式处理能力,很多人甚至写书来专门讲这个命令。这里咱们暂时介绍基本的功能,以后有机会将专门开辟一文来展开。

一个常见的用法就是把文件中的某几列打印出来:

# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | awk '{print $1, $2, $3}'
Nov 17 00:27:20

如上例,空格将一行分成了不同的列,咱们希望只把时间显示出来,而时间包括了第1,2,3列,因此,通过awk '{print $1, $2, $3}'就实现了此功能,其中$1就是引用第一列。

cut命令

有时候,一行内的数据并不是通过空格分隔开的,而是通过其它分隔符,那如何显示想要的列呢?通过cut命令,咱们同样可以轻松实现:

# head -n 5 /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
# head -n 5 /etc/passwd | cut -d: -f1
root
bin
daemon
adm
lp

/etc/passwd中的每一行基本上都是通过:进行分隔,其中第一列表示用户名,如果咱们只想把用户名输出的话,可以通过cut -d: -f1来实现,其中-d:表示以:号为分隔符,-f1表示显示第一列。可见,对于cut命令来说,咱们可以指定分隔符,那么前面通过awk实现的例子也可以通过cut来做:

# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | cut -d" " -f1-3
Nov 17 00:27:20

其中-d" "表示以空格为分隔符(注意,这里的空格必须以引号括起来,不然会被shell展开去除多余空格),-f1-3表示输出第1到3列,这里简用了-来表示范围,当然也可以写成-f1,2,3了。

此外,cut命令还可以指定输出哪些位的字符:

# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | cut -c1-16
Nov 17 00:27:20

其中,-c1-16表示输出第1到16个字符,当然,你同样可以以,来分别列举要输出哪几个。

tr命令

tr其实是translate的缩写,这个命令用来将某些字符翻译成另外的字符。

# tr --help
Usage: tr [OPTION]... SET1 [SET2]

这个命令就是把字符集SET1中的字符对应的转成字符集SET2中的字符。如将小写转成大写:

# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | tr a-z A-Z
NOV 17 00:27:20 TRAFFIC-BASE1 NAMED[1212]: MANAGED-KEYS-ZONE: UNABLE TO FETCH DNSKEY SET .: TIMED OUT

这里用-来方便的表示一定范围的字符集,当然,你完全可以一个个列出来你要的字符集。通常情况下,SET1SET2的长度保持一致,因为这个转换实际上是一对一的转换,当然,SET2的长度是可以大于SET1的,多余的字符不会被使用。但是,当SET2长度小于SET1时,tr命令会将SET2中最后一个字符填充不足的位数:

# echo 'abcdefg' | tr ab wyz
wycdefg
# echo 'abcdefg' | tr abcdefg wyz
wyzzzzz

对于tr还有一个常见的用途,就是用来去除字符串中的换行符:

# head -n 5 /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
# head -n 5 /etc/passwd | tr '\n' ' '
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

其中,\n表示换行符,示例中将换行符全部换成了空格。

最后,tr还有一个常见的用法,可以加上-d参数来删除字符集中的字符。

# echo abcdeWXYZ | tr -d a-z
WXYZ

示例中删除了所有小写字母。

sed命令

流式处理中,sed也是一个极为常用的命令,它可以用来替换字串,比之前的tr那是要强大无数倍了。

查看sed的帮助:

# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

它既可以直接在文件中替换字符串,也可以加收管道的数据。如基本用法:

# echo abcdefgabcd | sed 's/abc/ABC/'
ABCdefgabcd

其中's/abc/ABC/'指定了替换的规则,默认情况下只替换一次,如果需要全部替换,则需要在规则后面加入g

# echo abcdefgabcd | sed 's/abc/ABC/g'
ABCdefgABCd

规则中默认使用了/为分隔。当然,你也可以使用其他分隔符,这在要替换的字串中带有/的时候特别有用:

# echo "http://abc.test.com" | sed 's/http:\/\//https:\/\//'
https://abc.test.com
# echo "http://abc.test.com" | sed 's|http://|https://|'
https://abc.test.com

如果不指定新的分隔符|,那么就得使用转义符\//进行转义了,这样可读性就差了很多,采用|就自然多了。sed支持的分隔符还包括了:_

此外,sed不仅可以用来替换字串,还可以用来删除匹配的行:

# cat test2
http://abcdefg.test.com
12306.com
# cat test2 | sed '/12306/d'
http://abcdefg.test.com

高级用法

本博文还可以在博主个人主页中找到。

上一篇下一篇

猜你喜欢

热点阅读