Linux学习路线之二【The Linux command line---命令篇】

The Linux command line---命令篇

前言

一提到Linux,许多人都会说到“*”,但我不认为他们都知道“*”的真正涵义。“*”是一种权力,它决定你的计算机能做什么,同时能够拥有这种“*”的唯一方式就是知道计算机正在做什么。“*”是指一台没有任何秘密的计算机,你可以从它那里了解一切,只要你用心的去寻找。

不过一般来说,对于Linux 的启蒙教育,没有捷径可言。学习命令行富于挑战性,而且很费气力。这并不是说Linux 命令行很难学,而是它的知识量很大,不容易掌握。Linux 操作系统,差不多有数以千计的命令可供用户操作。由此可见,要给自己提个醒,命令行可不是轻轻松松就能学好的。

一、文件系统跳转

pwd       #打印当前工作目录
cd        #更改目录
cd ..     #返回上一级目录
cd -      #上一次访问的目录
cd /      #根目录

cd 快速改变当前工作目录的有效方法中可以使用相对路径或者绝对路径。
相对路径:

[me@linuxbox bin] cd ../sbin
[me@linuxbox sbin] pwd
/usr/sbin

绝对路径:

[me@linuxbox bin] cd /usr/sbin
[me@linuxbox sbin] pwd
/usr/sbin

二、操作文件或目录

2.1 基本操作

ls 	             #列出文件内容
ls -a            #列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的文件
ls -l            #查看当前目录内容以长模式输出

cp               #复制文件或目录
cp -rf           #强制递归复制当前目录/子目录中的所有文件

mv               #移动/重命名文件和目录
mv file1 file2   #移动file1到file2 如果file2存在,它的内容会被file1的内容重写,如果file2不存在则创建file2, 这两种情况file1都会消失不见
mv dir1 dir2     #如果目录dir2 不存在,创建目录dir2,并且移动目录dir1的内容到目录dir2 中,同时删除目录dir1。如果目录dir2存在,移动目录dir1(及它的内容)到目录dir2

rm -rf           #删除或移除文件和目录    -r 递归删除文件/子目录  -f 即为--force 忽视不存在的文件不显示提示信息
rm -rf *.log     # *为通配符匹配任意多个字符

mkdir dir1       #创建文件夹
mkdir dir1 dir2  #当前目录连续创建2个文件夹

2.2 创建链接

软链接:

ln -s /aa/bb/cc dd      #cc可以是一个文件或者目录
unlink dd               #取消软链接

三、查找命令

grep:

grep hello setup.csh          #在setup.csh文件中搜索hello字符串,大小写敏感显示行
grep -n hello setup.csh       #在setup.csh文件中搜索hello字符串,大小写敏感显示行和行号
grep -v hello setup.csh       #在setup.csh文件中搜索hello字符串,大小写敏感显示没搜到的行
grep -i hello setup.csh       #在setup.csh文件中搜索hello字符串,大小写敏感,显示行
ps -ef | grep -r 'hello' *             #在当前目录及其子目录下搜索“hello”行的文件

find:

find . -name "*.log" -ls        #在当前目录查找以log结尾的文件,并显示详细信息
find /root/ -perm hellp         #查找/root/目录下权限为hello的文件 
find . -type f -name "*.log"    #查找当目录,以.log结尾的普通文件 
find . -type d | sort           #查找当前所有目录并排序 

实时查看日志:

tail -f setup.csh       #查看文件的后10行
tail -n 100 setup.csh   #查看文件的后100行
head -n 100 setup.csh   #查看文件的前100行
head setup.csh          #查看文件的前10行
tail -n 100 setup.csh | grep -r 'hello'  #查看文件的后100行并搜索hello关键字符

终止当前操作

Ctrl+c和Ctrl+z都是中断命令,但是作用却不一样。

Ctrl+Z就扮演了类似的角色,将任务中断,但是任务并没有结束,在进程中只是维持挂起的状态,用户可以使用fg/bg操作前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行。
Ctrl+C也扮演类似的角色,强制中断程序的执行。

ctrl+z
ctrl+c

others:

[me@linuxbox work] whereis ls
ls: /usr/bin/ls  /usr/local/bin/ls /usr/share/man/manl/ls.1.gz

[ServerA@hmli work] which vcs
/tools/eda/synopsys/vcs/2021.12/bin/vcs

四、I/O重定向

“I/O” 代表输入/输出,通过这个工具,你可以将命令的输入来源以及输出地点重定向为文件。也可以把多个命令连接起来组成一个强大的命令管道。我们使用“>” 重定向符后接文件名将标准输出重定向到除屏幕以外的另一个文件。为什么我们要这样做呢?因为有时候把一个命令的运行结果存储到一个文件很有用处。例如,我们可以告诉shell 把ls 命令的运行结果输送到文件ls-output.txt 中去,由文件代替屏幕。

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt
[me@linuxbox ~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 167878 2008-02-01 15:07 ls-output.txt
[me@linuxbox ~]$ cat ls-output.txt
/usr/bin

[me@linuxbox ~]$ cat *.txt > aa.log    #将所有txt后缀的文件合并并重定向到另一个文件输出

五、键盘高级操作

  1. clear --------清空屏幕
  2. history -------显示历史列表内容

5.1 移动光标

移动光标所使用的按键

按键 行动
Ctrl-a 移动光标到行首
Ctrl-e 移动光标到行尾
Ctrl-f 光标前移一个字符;和右箭头作用一样
Ctrl-b 光标后移一个字符;和左箭头作用一样
Alt-f 光标前移一个字
Alt-b 光标后移一个字
Ctrl-l 清空屏幕,移动光标到左上角。clear 命令完成同样的工作

5.2 修改文本

Ctrl-d #删除光标位置的字符。
Ctrl-t #光标位置的字符和光标前面的字符互换位置。
Alt-t  #光标位置的字和其前面的字互换位置。
Alt-l  #把从光标位置到字尾的字符转换成小写字母。
Alt-u  #把从光标位置到字尾的字符转换成大写字母。
####剪切和粘贴文本####
Ctrl-k #剪切从光标位置到行尾的文本。
Ctrl-u #剪切从光标位置到行首的文本。
Alt-d  #剪切从光标位置到词尾的文本。
Alt-Backspace #剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。
Ctrl-y #把剪切环中的文本粘贴到光标位置。

六、权限

6.1 chmod

更改文件或目录的模式(权限),可以利用chmod 命令。注意只有文件的所有者或者超级用户才能更改文件或目录的模式。chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法或符号表示法。首先我们讨论一下八进制数字表示法。
通过八进制表示法,我们使用八进制数字来设置所期望的权限模式。因为每个八进制数字代表了3 个二进制数字,这种对应关系,正好映射到用来存储文件模式所使用的方案上。下表展示了我们所要表达的意思:
Linux学习路线之二【The Linux command line---命令篇】

[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
[me@linuxbox ~]$ chmod 600 foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw------- 1 me me 0 2008-03-06 14:52 foo.txt

虽然八进制到二进制的映射看起来不方便,但通常只会用到一些常见的映射关系:7 (rwx),6 (rw-),5 (r-x),4 (r–),和0 (-–)。

6.2 su, sudo

su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。

[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#

按下回车符之后,shell 提示我们输入超级用户的密码。如果密码输入正确,出现一个新的shell 提示符,这表明这个shell 具有超级用户特权(提示符的末尾字符是“#” 而不是”$”),并且当前工作目录是超级用户的家目录(通常是/root)。一旦进入一个新的shell,我们能执行超级用户所使用的命令。当工作完成后,输入“exit”,则返回到原来的shell.

[root@linuxbox ~]# exit
[me@linuxbox ~]$

su 和sudo 之间的一个重要区别是sudo 不会重新启动一个shell,也不会加载另一个用户的shell 运行环境。这意味者命令不必用单引号引起来

[me@linuxbox ~]$ sudo -l
User me may run the following commands on this host:
(ALL) ALL

七、进程

当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做init 的程序。init,依次地,再运行一系列的称为init 脚本的shell 脚本(位于/etc),它们可以启动所有的系统服务。其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户接口(User Interface)。这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。

7.1 ps查看进程

[me@linuxbox ~]$ ps
PID      TTY    TIME       CMD
5198    pts/1   00:00:00   bash
10129   pts/1   00:00:00   ps

[me@linuxbox ~]$ ps aux
USER PID %CPU %MEM VSZ   RSS TTY STAT   START  TIME COMMAND
root  1   0.0 0.0  2136  644 ?    Ss    Mar05  0:31  init
root  2   0.0 0.0  0     0   ?    S< Mar05  0:00  [kt]
and many more...

这个选项组合,能够显示属于每个用户的进程信息。使用这个选项,可以唤醒“BSD 风格”
的输出结果。Linux 版本的ps 命令,可以模拟几个不同Unix 版本中的ps 程序的行为。通过
这些选项,我们得到这些额外的列。
USER 用户ID. 进程的所有者。
%CPU 以百分比表示的CPU 使用率
%MEM 以百分比表示的内存使用率
VSZ 虚拟内存大小
RSS 进程占用的物理内存的大小,以千字节为单位。
START 进程启动的时间。若它的值超过24 小时,则用天表示。

[me@linuxbox ~]$ ps -ef   #查看所有正在运行的进程

7.2 top查看进程

top 程序以进程活动顺序显示连续更新的系统进程列表。(默认情况下,每三秒钟更新一次),“top” 这个名字来源于top 程序是用来查看系统中“顶端”进程的。top 显示结果由两部分组成:最上面是系统概要,下面是进程列表,以CPU 的使用率排序。

[me@linuxbox ~]$ top
top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total, 1 running, 106 sleeping, 0 stopped, 2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si
Mem: 319496k total, 314860k used, 4636k free, 19392k buff
Swap: 875500k total, 149128k used, 726372k free, 114676k cach
PID USER PR  NI  VIRT RES   SHR S %CPU %MEM TIME+    COMMAND
6244 me  39  19 31752 3124 2188 S 6.3  1.0  16:24.42 trackerd
....

其中系统概要包含许多有用信息。下表是对系统概要的说明:
Linux学习路线之二【The Linux command line---命令篇】
top 程序接受一系列从键盘输入的命令。两个最有趣的命令是h 和q。h,显示程序的帮助屏幕,q,退出top 程序。

常用的top参数指定

[me@linuxbox ~]$ top -d 2            #每隔两秒钟刷新一下屏幕信息
[me@linuxbox ~]$ top -n 10           #信息更新3秒后停止更新退出top
[me@linuxbox ~]$ top -u me           #指定用户名查找进程信息

7.3 & 进程放置在后台:

假如说我们想让shell 提示符返回,却不终止xlogo 程序。我们可以把这个程序放到后台(background) 执行。把终端想象是一个有前台(包含在表层可见的事物,像shell 提示符)和后台(包含表层之下的隐藏的事物)(的设备)。为了启动一个程序并让它立即在后台运行,我们在程序命令之后,加上“&” 字符
此时shell 告诉我们,已经启动了任务号(job number) 为1(“[1]”),PID 为28236 的程序。如果我们运行ps 命令,可以看到我们的进程:

[me@linuxbox ~]$ xlogo &
[1] 28236
[me@linuxbox ~]$

[me@linuxbox ~]$ ps
PID TTY TIME CMD
10603 pts/1 00:00:00 bash
28236 pts/1 00:00:00 xlogo
28239 pts/1 00:00:00 ps

7.4 fg 进程返回前台:

shell 的任务控制功能给出了一种列出从我们终端中启动了的任务的方法。执行jobs 命令,我们可以看到这个输出列表:
一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用Ctrl-c 来中断它。为了让一个进程返回前台(foreground),这样使用fg 命令:

[me@linuxbox ~]$ jobs
[1]+ Running xlogo &

[me@linuxbox ~]$ fg %1
xlogo

fg 命令之后,跟随着一个百分号和任务序号(叫做jobspec, 如此处的%1)就可以了。如果我们只有一个后台任务,那么jobspec(job specification) 是可有可无的。输入Ctrl-c 来终止xlogo 程序。

7.5 Ctrl-z 停止进程:

输入Ctrl-z,可以停止一个前台进程。让我们试一下。在命令提示符下,执行xlogo命令,然后输入Ctrl-z:

[me@linuxbox ~]$ xlogo
[1]+ Stopped xlogo
[me@linuxbox ~]$

停止xlogo 程序之后,通过调整xlogo 的窗口大小,我们可以证实这个程序已经停止了。它看起来像死掉了一样。使用fg 命令,可以恢复程序到前台运行,或者用bg 命令把程序移到后台。

[me@linuxbox ~]$ bg %1
[1]+ xlogo &
[me@linuxbox ~]$

7.6 kill杀掉进程:

[me@linuxbox ~]$ ps
PID TTY TIME CMD
10603 pts/1 00:00:00 bash
28236 pts/1 00:00:00 xlogo
28239 pts/1 00:00:00 ps
[me@linuxbox ~] 
[me@linuxbox ~] kill 28236                #杀掉进程id为28236的进程
[me@linuxbox ~] kill -9 28236             #强制杀掉进程id为28236的进程

[me@linuxbox ~]$ bg %1
[1]+ xlogo &
[me@linuxbox ~] kill %1                   #按照job id杀掉进程

也有可能通过killall 命令,给匹配特定程序或用户名的多个进程发送信号。下面是killall 命令的语法形式:
killall [-u user] [-signal] name…

[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated xlogo
[2]+ Terminated xlogo

八、压缩、解压操作

压缩:

[me@linuxbox ~]$ tar -cvf test.tar *.txt         #将目录里所有txt文件打包成test.tar
[me@linuxbox ~]$ tar -czf test.tar.gz *.txt      #将目录里所有txt文件打包成test.tar后,用gzip压缩生成一个gzip压缩过的包,命名为test.tar.gz
[me@linuxbox ~]$ tar -cjf test.tar.bz2 *.txt     #将目录里所有txt文件打包成test.tar后,用bzip2压缩生成一个gzip压缩过的包,命名为test.tar.bz2
[me@linuxbox ~]$ zip test.zip *.txt              #将目录里所有txt文件打包成zip格式

解压:

[me@linuxbox ~]$ tar -xvf test.tar               #解压tar包
[me@linuxbox ~]$ tar -xzvf test.tar.gz           #解压tar.gz包
[me@linuxbox ~]$ tar -xjvf test.tar.bz2 *.txt    #解压tar.bz2包
[me@linuxbox ~]$ zip test.zip *.txt              #解压zip格式包

总结:

  • *.tar 用tar -xvf解压
  • *.gz用gzip或者gunzip解压
  • .tar.gz或.tgz用tar -xzf解压
  • *.bz2用bzip2或者bunzip2解压
  • *.tar.bz2用tar -xjf解压
  • *.zip用unzip解压

九、磁盘、文件/目录、内存大小查看

磁盘查看:

df命令用于查看磁盘空间大小,默认单位是KB

  • Filesystem,磁盘分区
  • Size,磁盘分区的大小
  • Used,已使用的空间
  • Avail,可用的空间
  • Use%,已使用的百分比
  • Mounted on,挂载点
[me@linuxbox ~]$ df -lh
FileSystem                    Size     Used    Avail     Use%   Mounted on
/dev/sda2                      49G      12G     37G       26%    /
tmpfs                          3.9G     1.6M    3.9G      0%     /dev
/dev/xvda3                     51G      14G     37G       40%    /SCRATCH
....

参数h:把显示的单位改成容易辨认的单位,不再是KB
参数l: 表示只显示本地磁盘分区,不包含共享磁盘

[me@linuxbox ~]$ df -h
FileSystem                    Size     Used    Avail     Use%   Mounted on
/dev/sda2                      49G      12G     37G       26%    /
tmpfs                          3.9G     1.6M    3.9G      0%     /dev
/dev/xvda3                     51G      14G     37G       40%    /SCRATCH
//10.168.71.112/file           1T       500G    500G      50%    /data/file
....

可以看到与带l参数相比会多出其他服务器共享目录。

文件目录查看:

[me@linuxbox ~]$ du -lh /data0/work        #查看当前文件夹下各个文件大小
100K       /data/work/setup.csh
2G         /data/work/test.bat
200K       /data/work/Makefile
10K        /data/work/runtime_demo/readme
.....
5.6G

[me@linuxbox ~]$ du -sh /data0/work        #查看当前文件夹大小
5.6G      /data0/work

[me@linuxbox ~]$ cd /data0/work
[me@linuxbox work]$ du -h --max-depth=1        #只查看当前目录下文件或文件夹大小,其中1为目录层数
100K       ./setup.csh
2G         ./test.bat
200K       ./Makefile
10G        ./runtime_demo
....

内存查看:

[me@linuxbox ~]$ free -g 
            total        used          free     shared        buff/cache         available
Mem:          512         300          100       0                100              100
Swap:         84           0            84       0                 0                0 

十、lscpu命令

[me@linuxbox ~]$ lscpu
Achitecture:           x86_64               #架构
CPU  op_mode:         32-bit,64-bit
Byte Order:            Little Endian
CPU(s):                64                   #逻辑cpu个数
On-line CPU(s) list:   0-63
Thread(s) per core :   2                    #每个核心线程数
Core(s)  per socket:   16                   #每个物理CPU的核数
Socket(s):             2                    #物理CPU个数
NUMA node(s):          2                    
Vendor ID:             AuthenticAMD
CPU family:            23
Model:                 49
Model name:            AMD EPYC 7302 16-core Processor
Stepping :             0
CPU MHz :              3000.008             #CPU主频
BogoMIPS:              5999.94
Virualization:         AMD-V
L1d cache:             32K
L1i cache:             32K
L2  cache:             512K
L3  cache:             16384K
NUMA  node0 CPU(s):    0-15,32-47
NUMA  node1 CPU(s):    16-31,48-63

计算方法:
总核数 = 物理cpu个数* 每颗物理CPU的核数
总逻辑核数 = 物理CPU个数 * 每个物理CPU的核数 * 每个核心线程数

上一篇:《Web安全之机器学习入门》笔记:第十五章 15.7 TensorFlow识别垃圾邮件(一)


下一篇:初识 JVM(带你从不同的视角认识 JVM)