Linux 命令基础

Linux 基础命令是任何一个开发人员应该掌握的基本技能。大多数项目的生产部署环境都会选择 Linux,所以在项目运维和故障排除的时候,Linux 命令能够起到关键的作用。

获取文件内容

基本指令

命令 描述 备注
cat 打印文件内容 -n: 打印出行号;-b: 不打印出行号
tac 是 cat 的反向操作,从最后一行开始打印
more 一页一页查看文件内容,比较适合大文件的查看
less 和 more 类似,但是多了一个向前翻页的功能
head 打印文件前几行 head -n filename
tail head 的反向操作,打印后几行
od 以字符或者十六进制的形式显示二进制文件

指令 & 文件搜索

基本指令

命令 描述 备注
which 指令搜索 -a: 列出所有指令,而不是列出一个
whereis 文件搜索。速度非常快, 只搜索几个特定的目录
locate 文件搜索。可以用关键字或者正则表达式进行搜索
find 文件搜索。可以使用文件的属性和权限进行搜索

find 指令详解

指令的基础用法如下:

1
2
# find [basedir] [option] // basedir 不指定则为当前目录,及其子目录
find . -name "shadow*"

按修改时间搜索的参数

1
2
3
4
-mtime  n :列出在 n 天前的那一天修改过内容的文件
-mtime +n :列出在 n 天之前 (不含 n 天本身) 修改过内容的文件
-mtime -n :列出在 n 天之内 (含 n 天本身) 修改过内容的文件
-newer file : 列出比 file 更新的文件

按文件所属搜索的参数

1
2
3
4
5
6
-uid n
-gid n
-user name
-group name
-nouser :搜索拥有者不存在于 /etc/passwd 的文件
-nogroup:搜索所属群组不存在于 /etc/group 的文件

按文件属性搜索的参数

1
2
3
4
5
6
-name filename
-size [+-]SIZE:搜寻比 SIZE 还要大 (+) 或小 (-) 的文件。这个 SIZE 的规格有:c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是 -size +50k
-type TYPE
-perm mode :搜索权限等于 mode 的文件
-perm -mode :搜索权限包含 mode 的文件
-perm /mode :搜索权限包含任一 mode 的文件

正则表达式

基本指令

指令 描述 备注
grep 使用正则表示式进行全局查找并打印
printf 用于格式化输出 在给 printf 传数据时需要使用 $( ) 形式
awk 每次处理一行,处理的最小单位是字段

grep 详解

指令 grep (globally search a regular expression and print)的基本用法如下:

1
2
3
4
5
6
$ grep [-acinv] [--color=auto] 搜寻字符串 filename
-c : 统计个数
-i : 忽略大小写
-n : 输出行号
-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行
--color=auto :找到的关键字加颜色显示

示例如下:

1
2
3
4
5
6
7
# test.txt 的内容如下
hello world
123
aaaaa

$ gerp -n 'world' test.txt
1:hello world

awk 详解

指令 awk 的基本用法如下:

1
$ awk '{[pattern] action}' {filenames}

每次处理输入流中的一行,然后根据设置的条件匹配相应的字段,然后做处理。

awk 变量:

变量名 代表意义
NF 每一行拥有的字段总数
NR 目前所处理的是第几行数据
FS 目前的分隔字符,默认是空格键

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 取出登录用户的用户名和 IP
$ last -n 5
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)

# $1, $3 代表了第几个段,每行根据空格和tab来划分段
$ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}'
dmtsai lines: 1 columns: 10
dmtsai lines: 2 columns: 10
dmtsai lines: 3 columns: 10
dmtsai lines: 4 columns: 10
dmtsai lines: 5 columns: 9

Pipeline 指令

管线指令 | 将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用 Pipeline。

下面的指令通常与管线指令搭配使用,将其它指令的输出作为指令的输入。

字符转换基本指令

指令 描述 备注
tr 删除一行中的字符,或者对字符进行替换
col 将 tab 字符转为空格字符
expand 将 tab 转换一定数量的空格,默认是 8 个
join 将有相同数据的那一行合并在一起
paste 直接将两行粘贴在一起
split 将一个文件划分成多个文件

cut 指令

cut 对数据进行一行一行的切分,用法如下:

1
2
3
4
$ cut -d
-d :分隔符
-f :经过 -d 分隔后,使用 -f n 取出第 n 个区间
-c :以字符为单位取出区间

sort 指令

sort 对数据进行排序,用法如下:

1
2
3
4
5
6
7
8
9
$ sort [options] [file & stdin]  
-f :忽略大小写
-b :忽略最前面的空格
-M :以月份的名字来排序,例如 JAN,DEC
-n :使用数字
-r :反向排序
-u :相当于 unique,重复的内容只出现一次
-t :分隔符,默认为 tab
-k :指定排序的区间

uniq 指令

uniq 只将重复的数据读取一次,用法如下:

1
2
3
$ uniq [-ic]
-i :忽略大小写
-c :进行计数

tee 指令

输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。

进程管理

基本指令

指令 描述 备注
ps 查看某个时间点的进程信息 -l: 查看自己的进程;-aux: 查看系统进程
top 实时显示进程信息
pstree 查看进程树
netstat 查看占用端口的进程 查看特定端口的进程:netstat -anp | grep port

进程状态

在 Linux 中进程一共有 6 种状态,如下所示:

状态 说明
R running or runnable (on run queue)
D uninterruptible sleep (usually I/O)
S interruptible sleep (waiting for an event to complete)
Z zombie (terminated but not reaped by its parent)
T stopped (either by a job control signal or because it is being traced)
X dead (should never be seen)

常用指令

查看程序对应的进程号

ps -ef|grep 进程名

查看进程占用的端口号

netstat -anp|grep pid

查看端口号所对应的进程号

lsof -i:端口号

数据流重定向

重定向指的是使用文件代替标准输入、标准输出和标准错误输出。

描述 代码 运算符
标准输入 (stdin) 0 < 或 <<
标准输出 (stdout) 1 > 或 >>
标准错误输出 (stderr) 2 2> 或 2>>

注意:

  1. 一个箭头的表示以覆盖的方式重定向,两个箭头的表示以追加的方式重定向。
  2. 可以将不需要的标准输出以及标准错误输出重定向到 /dev/null,相当于扔进垃圾箱。
  3. 如果需要将标准输出以及标准错误输出同时重定向到一个文件,需要将某个输出转换为另一个输出。例如 2>&1 表示将标准错误输出转换为标准输出。

指令搜索的顺序

在类 Unix 操作系统中,按照如下的顺序搜索指令:

  1. 以绝对或相对路径来执行指令,例如:/bin/ls 或者 ./ls
  2. 由别名找到该指令来执行
  3. 由 Bash 内建的指令来执行
  4. 按 PATH 变量指定的搜索路径的顺序来找到指令来执行