每天学命令

ps命令显示的信息类似于 Windows 的任务管理器。也是参数超级多的一个命令,所以就不列参数了,需要查看时直接搜索,这里列举一下实例。

使用实例

显示当前执行的所有程序

1
2
3
4
5
6
7
➜  ~ ps -a
PID TTY TIME CMD
879 tty2 00:03:43 Xorg
990 tty2 00:00:00 gnome-session-b
2653 pts/0 00:00:00 zsh
12365 pts/0 00:00:00 ps

显示所有程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  ~ ps -A
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
6 ? 00:00:00 kworker/0:0H-kblockd
9 ? 00:00:00 mm_percpu_wq
10 ? 00:00:00 ksoftirqd/0
11 ? 00:00:02 rcu_sched
12 ? 00:00:00 migration/0
13 ? 00:00:00 idle_inject/0
14 ? 00:00:00 cpuhp/0
15 ? 00:00:00 kdevtmpfs
.
.
.

显示指定用户的信息

1
➜  ~ ps -u root

a显示现行终端机下的所有程序,包括其他用户的程序,u以用户为主的格式来显示程序状况,x显示所有程序,不以终端机来区分
USER-运行该流程的用户。

%CPU-进程 CPU 利用率。

%MEM-进程驻留集大小占计算机物理内存的百分比。

VSZ-KiB 中进程的虚拟内存大小。

RSS-进程正在使用的物理内存的大小。

STAT-进程状态代码,可以是 Z(zombie),S(休眠),R(运行)..等等。

START-命令启动的时间。

1
2
3
4
5
➜  ~ ps aux              
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 102084 11540 ? Ss 09:09 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 09:09 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:09 0:00 [rcu_gp]

按 CPU 资源的使用量对进程进行排序:

1
2
3
4
5
6
7
8
9
10
11
➜  ~ ps aux | sort -nk 3
avahi 492 0.0 0.0 8536 3260 ? Ss 09:09 0:00 avahi-daemon: running [hanhan.local]
avahi 552 0.0 0.0 8352 332 ? S 09:09 0:00 avahi-daemon: chroot helper
colord 1442 0.0 0.3 255144 14408 ? Ssl 09:09 0:00 /usr/libexec/colord
dominic 1068 0.0 0.0 31244 364 ? S 09:09 0:00 /usr/bin/VBoxClient --clipboard
dominic 1069 0.0 0.9 163512 39088 ? Sl 09:09 0:00 /usr/bin/VBoxClient --clipboard
dominic 1080 0.0 0.0 31244 364 ? S 09:09 0:00 /usr/bin/VBoxClient --seamless

# 其中`sort`命令中`-n`为按数值进行排序,`-k 3` 表示以输出结果的第三列来进行排序,
# 从上一个实例中看到,第三列为CPU使用率`%CPU`。
# 同理ps aux | sort -rnk 4 即按内存使用降序排序

显示前 5 名最耗 CPU 的进程

1
2
3
4
5
➜  ~ ps aux --sort=-pcpu | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.6 0.7 51396 7644 ? Ss 02:02 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root 1249 2.6 3.0 355800 30896 tty1 Rsl+ 02:02 0:02 /usr/bin/X -background none :0 vt01 -nolisten tcp
root 508 2.4 1.6 248488 16776 ? Ss 02:02 0:03 /usr/bin/python /usr/sbin/firewalld --nofor

下面的命令会显示进程 id 为 3150 的进程的所有线程

1
➜  ~ ps -p 3150 -L

看到同事要安装自己编译一天的库,本想传授一下“踩坑经验”,结果他用scp命令直接从已经安装好的电脑里复制了一份。心里一万只 XXX 在奔腾。

早知道先学学这个命令了。

可选参数

参数 功能
-1 强制 scp 命令使用协议 ssh1
-2 强制 scp 命令使用协议 ssh2
-4 强制 scp 命令使用协议 ssh2
-6 强制 scp 命令只使用 IPv6 寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩
-p 保留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条
-r 递归复制整个目录
-v 详细方式显示输出
-P 注意是大写的 P, port 是指定数据传输用到的端口号

使用实例

复制文件

1
2
scp local_file rmot_usr@rmot_ip:rmot_folder
scp /opt/soft/ root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz

grep全称global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来。这名字就怪吓人,如果熟练掌握正则表达式,配上这命令 Linux 里可以横着走了。

这个命令参数实在太多,加上正则表达式估计一张纸不够。那就直接上实例吧。

使用实例

在当前目录中,查找后缀带有cpp字样的文中包含test字符串的文件,并打印所在行

1
2
grep test *cpp
grep --colorauto test *cpp # 用颜色标记

通过”-v”参数可以打印出不符合条件行的内容。

1
grep -v test *cpp

系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)。-n--line-number 可以显示符合样式的那一行之前,标示出该行的列数编号。

1
grep -n '2019-10-24 00:01:11' *.log

grep 静默输出,不会输出任何信息,如果命令运行成功返回 0,失败则返回非 0 值。一般用于条件测试。

1
grep -q "test" filename

在多级目录中对文本进行递归搜索

1
grep "text" . -r -n

配合管道,查找指定的进程信息

1
ps -ef | grep svn

查找指定的进程个数,-c计数

1
ps -ef | grep svn -c

常用正则表达式通配符
| 通配符 | 功能 |
| :—-: | :—-: |
| c* | 将匹配 0 个(即空白)或多个字符 c(c 为任一字符) |
| . | 将匹配任何一个字符,且只能是一个字符 |
| [xyz] | 匹配方括号中的任意一个字符 |
| [^xyz] | 匹配除方括号中字符外的所有字符 |
| ^ | 锁定行的开头 |
| $ | 锁定行的结尾 |

id.txt中找到所有以 3207 开头的数据

1
grep ^3207 id.txt

cat 可以将文件的内容方便地输出到屏幕上。但是它的全称concatenate意为“连接”,连接文件也是它的重要功能之一,很多人可能都不常用。只记得输出文件内容了。

可选参数

1
2
3
4
5
6
7
8
9
-n 或 --number              #由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank #和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank #当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting #使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends # 在每行结束处显示 $。
-T 或 --show-tabs: #将 TAB 字符显示为 ^I。
-A, --show-all #等价于 -vET。
-e #等价于"-vE"选项;
-t #等价于"-vT"选项;

使用实例

将文件内容输出到屏幕

1
2
3
4
5
➜  ~ cat test.txt 
This is firt line!
This is second line!
This is third line!
This is fourth line!

test.txt的内容输入到test01.txt

1
2
3
4
5
6
➜  ~ cat test.txt > test01.txt
➜ ~ cat test01.txt
This is firt line!
This is second line!
This is third line!
This is fourth line!

带行号输出

1
2
3
4
5
➜  ~ cat -n test.txt 
1 This is firt line!
2 This is second line!
3 This is third line!
4 This is fourth line!

将两个文件内容合并,再写入到第三个文件中

1
2
3
4
5
6
7
8
9
10
➜  ~ cat test.txt test01.txt >> test02.txt
➜ ~ cat test02.txt
This is firt line!
This is second line!
This is third line!
This is fourth line!
This is firt line!
This is second line!
This is third line!
This is fourth line!

清空文件中的内容

1
2
3
➜  ~ cat /dev/null > test.txt 
➜ ~ cat test.txt
➜ ~

在类 Unix 系统中,/dev/null 称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个 EOF。

Reference

  1. https://www.runoob.com/linux/linux-comm-cat.html

Linux ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。这有点像 Windows 环境下的快捷方式。介绍命令前了解一下软链接,硬链接具体是什么。

在 Linux 系统中,每个文件对应一个 inode,文件的内容在存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block。当然多个文件名可以指向同一个inode

使用ll命令显示文件的详细信息,-i参数显示其结点信息,其中最前面的一串数字就是inode信息。我们以/opt/test.txt文件为例,查看其结点信息。

1
2
dominic@hanhan:/opt$ ll -i test.txt 
2498138 -rw-r--r-- 1 root root 4 83 12:16 test.txt

使用 ln 命令在/opt/temp目录下创建一个 test.txt 文件的硬链接,然后观察其文件属性:

1
2
3
4
dominic@hanhan:/opt/temp$ sudo ln ../test.txt .
dominic@hanhan:/opt/temp$ ll -i ../test.txt test.txt
2498138 -rw-r--r-- 2 root root 4 83 12:16 ../test.txt
2498138 -rw-r--r-- 2 root root 4 83 12:16 test.txt

我们再用ll -i命令查看结点信息,发现这两个文件名的结点信息是一样的。说明这两个文件名指向的是同一个文件。其中第三个字段是链接数,数字2,表示有两个文件名链接到同一个inode

硬链接的特点

  • 硬链接,以文件副本的形式存在。但不占用实际空间。
    由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建
  • 只要还有一个文件名引用着文件,文件就不会被真正删除
    删除硬链接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬链接时才会真正删除文件的内容数据。

软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件 (分配一个inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。

我们以/opt/test.txt为例,在/opt/temp目录中,为其创建一个软链接,然后查看其inode结点信息。

1
2
3
4
dominic@hanhan:/opt/temp$ sudo ln -s ../test.txt test2.txt
dominic@hanhan:/opt/temp$ ll -i ../test.txt test2.txt
2498139 lrwxrwxrwx 1 root root 11 83 14:01 test2.txt -> ../test.txt
2498138 -rw-r--r-- 2 root root 4 83 12:16 ../test.txt
  • 第一个字段不同,说明是两个文件了
  • 第二个字段表示权限,第一个字母表示文件类型,l说明书软链接文件
  • 第三个字段表示链接数,仍然是2,说明软链接不增加源文件链接数
  • 第六个字段是文件大小,新建的软链接文件时 11 字节,这就是/opt/test.txt的长度。

软链接特点

  • 软链接,以路径的形式存在。类似于 Windows 操作系统中的快捷方式
  • 软链接可以 跨文件系统,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接

使用实例

ln [参数][源文件或目录][目标文件或目录]
为文件test.txt创建一个硬链接

1
sudo ln test.txt /etc/

删除test.txt的硬链接,因为是以副本形式存在的,所以直接用rm命令将其删除即可。

1
sudo rm /etc/test.txt 

为文件test.txt创建一个软链接

1
sudo ln -s test.txt /etc/test2.txt

删除软链接也一样,直接用rm命令删除软链接的名称即可。

Reference

ed命令是文本编辑器,用于文本编辑。

ed是 Linux 中功能最简单的文本编辑程序,一次仅能编辑一行而非全屏幕方式的操作。很多命令和vim相似,平时开发中并不常用,但是在编辑大文本时还是会用到。

学学无妨毕竟这是 Unix 系统三大要件(编辑器,汇编器和 shell)之一。

ed编辑器有两种模式:命令模式和输入模式。命令模式下输入a,i,c,d可以进入对应的编辑模式,接下来可以输入任何想要输入的内容,输入完毕或者要切换命令时,可以输入.退出输入模式。

Commands

1
2
3
4
a           #添加到行
i #添加到行首
c #改变行
d #删除行

Line Address

1
2
3
4
5
6
7
8
9
10
. #buffer 中 当前行
$ #最后一行
n #第 n 行,行的范围是 [0,$]
- or ^ #前一行
-n or ^n #前 n 行
+ or +n #后一行及后n行
, or % #全部行,等同于 1,$
; #当前行到最后一行 .,$
/re/ #下一个包含正则 re 的行
?re? #上一个包含正则 re 的行

使用实例

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
dominic@hanhan:~$ ed                # 进入编辑模式
This is a test text! # 输入文本
. # 结束输入命令
This is a test text! # 回显当前行
n # 显示行号命令
1 This is a test text! # 回显当前行并显示行号
c # 改变行命令
This is changed text! # 输入更改后的内容
. # 结束输入命令
n # 显示行号命令
1 This is changed text! # 回显当前行并显示行号
i # 在首行插入命令
This is first line! # 输入插入内容
. # 结束输入命令
+ # 后一行命令
This is changed text! # 回显后一行
d # 删除当前行
. # 回显当前行命令
This is firt line! # 回显当前行
a
This is second line!
This is third line!
This is fourth line!
w test.txt # 写入并保存文件
q # 退出编辑器

dominic@hanhan:~$ cat test.txt # 查看内容
This is first line!s
This is second line!
This is third line!
This is fourth line!

想知道自己代码写了多少行,可以一个wc命令搞定。

可选参数

1
2
3
-l:仅列出行;
-w:仅列出多少字 (英文单字);
-m:多少字符

使用实例

统计hello.c文件夹下文件总共多少行

1
2
$ wc -l  hello.c
14 hello.c

统计文件夹下文件的个数

1
2
ls -l | grep "^-" | wc -l

统计当前目录下文件的个数(包括子目录)

1
2
ls -lR| grep "^-" | wc -l

查看目录下文件夹 (目录) 的个数(包括子目录)

1
ls -lR | grep "^d" | wc -l
  • 过滤ls的输出信息,只保留一般文件,只保留目录是grep "^d"

命令格式

1
find [path] [expression]

path下查找expression表示的文件

常用命令

一般常见就是自己不知道写的某个文件或者文件夹放哪里了,又或者只记住部分文件名。以下几个命令就能帮到你。

按文件名查找

1
2
3
4
5
find  -name filename(查找结果显示路径)或者 find filename(查找结果不显示路径)

find hello.cpp #当前目录下精确查找hello.cpp文件
find hello #当前目录下精确查找hello文件
find hello* #当前目录下模糊查找以hello为前缀的文件

按类型查找

这就是为查找文件夹用的。

1
find -type [fdlcb] name

[fdlcb]都是类型,d就是目录,文件夹类型。

1
find / -type d -name "helloworld"   #查找名为helloworld的文件夹

按文件名查找

以下就详细介绍一些参数

1
2
find -name "hello.cpp"              # 搜索文件名,大小写敏感
find -iname "hello.cpp" #大小写不敏感

按文件大小查找

1
2
3
4
5
find [path] -size 50M

find / -size 10M # 查找系统中大小等于10M的文件
find / -size +50M # 查找系统中大小大于50M的文件
find / -size -30M # 查找系统中大小小于30M的文件

按时间来查找文件

Linux 会存储下面的时间:

  • Access time 上一次文件读或者写的时间
  • Modifica time 上一次文件被修改的时间
  • Change time 上一次文件 inode meta 信息被修改的时间

在按照时间查找时,可以使用 -atime-mtime 或者 -ctime,和之前 size参数一样可以使用 + 或者 -时间范围,下图表示find的时间轴。+表示超过多少天,-表示多少天以内。

此外,也可以换成-amin-mmin 或者 -cmin参数,单位是分钟。

1
2
3
find / -mtime 1          # 寻找修改时间超过一天的文件
find / -atime -1 # 寻找在一天时间内被访问的文件
find / -ctime +3 # 寻找 meta 信息被修改的时间超过 3 天的文件

Reference

  1. http://c.biancheng.net/view/779.html

  2. https://einverne.github.io/post/2018/02/find-command.html#%E6%89%B9%E9%87%8F%E5%88%A0%E9%99%A4%E6%97%B6%E9%97%B4%E8%B6%85%E8%BF%87-1-%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6

df全称disk filesystem ,以磁盘分区为单位查看文件系统,可以查看磁盘文件占用空间,磁盘剩余空间等信息。

命令格式

1
df [] []

可选参数

1
2
3
4
5
6
7
8
9
10
11
-a      全部文件系统列表
-h 方便阅读方式显示
-H 等于“-h”,但是计算式,1K=1000,而不是 1K=1024
-i 显示 inode 信息
-k 区块为 1024 字节
-l 只显示本地文件系统
-m 区块为 1048576 字节
--no-sync 忽略 sync 命令
-P 输出格式为 POSIX
--sync 在取得磁盘信息前,先执行 sync 命令
-T 文件系统类型

使用实例

df -T显示包含文件系统,类型,可用大小,已用大小,挂载点等信息。

1
2
3
4
5
6
7
8
9
10
dominic@hanhan:~$ df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
udev devtmpfs 1985056 0 1985056 0% /dev
tmpfs tmpfs 403036 1304 401732 1% /run
/dev/sda5 ext4 50824704 20826256 27386992 44% /
tmpfs tmpfs 2015172 0 2015172 0% /dev/shm
tmpfs tmpfs 5120 4 5116 1% /run/lock
tmpfs tmpfs 2015172 0 2015172 0% /sys/fs/cgroup
/dev/loop0 squashfs 56832 56832 0 100% /snap/core18/1988
/dev/loop1 squashfs 56832 56832 0 100% /snap/core18/2074

du全称disk usage可以查看文件,文件夹占用情况。

命令格式

1
du [opt] [filename]

可选参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-a或-all                    #显示目录中个别文件的大小。
-b或-bytes #显示目录或文件大小时,以byte为单位。
-c或--total #除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-D或--dereference-args #显示指定符号连接的源文件大小。
-h或--human-readable #以K,M,G为单位,提高信息的可读性。
-H或--si #与-h参数相同,但是K,M,G是以1000为换算单位。
-k或--kilobytes #以1024 bytes为单位。
-l或--count-links #重复计算硬件连接的文件。
-L<符号连接>或-
-dereference<符号连接> #显示选项中所指定符号连接的源文件大小。
-m或--megabytes #以1MB为单位。
-s或--summarize #仅显示总计。
-S或--separate-dirs #显示个别目录的大小时,并不含其子目录的大小。
-x或--one-file-xystem #以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X<文件>或--exclude-from=<文件> #在<文件>指定目录或文件。
--exclude=<目录或文件> #略过指定的目录或文件。
--max-depth=<目录层数> #超过指定层数的目录后,予以忽略。
--help #显示帮助。
--version #显示版本信息

使用实例

查看当前目录使用情况

1
2
3
4
5
6
7
8
dominic@hanhan:~/learning-linux$ du
56 ./.git/hooks
8 ./.git/logs/refs/heads
8 ./.git/logs/refs/remotes/origin
12 ./.git/logs/refs/remotes
24 ./.git/logs/refs
32 ./.git/logs
8 ./.git/info

以易读的方式查看使用情况

1
2
3
4
5
6
7
8
dominic@hanhan:~/learning-linux$ du -h
56K ./.git/hooks
8.0K ./.git/logs/refs/heads
8.0K ./.git/logs/refs/remotes/origin
12K ./.git/logs/refs/remotes
24K ./.git/logs/refs
32K ./.git/logs
8.0K ./.git/info

只输出当前目录占用总空间,同上-h命令就是以人读的方式(加上了数据单位)

1
2
dominic@hanhan:~/learning-linux$ du -hs
264K .

查看当前目录及其指定深度目录的大小

1
2
3
不深入子目录,就是当前文件夹所占用大小
dominic@hanhan:~/learning-linux$ du -h --max-depth=0
264K .
1
2
3
4
5
6
7
8
9
10
11
12
13
深入一层
dominic@hanhan:~/learning-linux$ du -h --max-depth=2
56K ./.git/hooks
32K ./.git/logs
8.0K ./.git/info
28K ./.git/objects
4.0K ./.git/branches
28K ./.git/refs
180K ./.git
24K ./helloworld/c
44K ./helloworld/shell
72K ./helloworld
264K .

忽略helloworld这个文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dominic@hanhan:~/learning-linux$ du --exclude=helloworld
56 ./.git/hooks
8 ./.git/logs/refs/heads
8 ./.git/logs/refs/remotes/origin
12 ./.git/logs/refs/remotes
24 ./.git/logs/refs
32 ./.git/logs
8 ./.git/info
4 ./.git/objects/info
20 ./.git/objects/pack
28 ./.git/objects
4 ./.git/branches
8 ./.git/refs/heads
4 ./.git/refs/tags
8 ./.git/refs/remotes/origin
12 ./.git/refs/remotes
28 ./.git/refs
180 ./.git
192 .

Refernece

  1. https://einverne.github.io/post/2018/03/du-find-out-which-fold-take-space.html
  2. https://www.runoob.com/linux/linux-comm-du.html
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×