近期复习了Linux相关命令,命令的学习须在使用中掌握。以下命令是对最近工作中常用命令的总结。因为大概知道其使用用法,只是对部分细节有所遗忘,特整理出来以供之后复习。可能不太适合新手用来学习Linux命令,更像是工具文档。
文件管理:cat、 chmod、 chown、diff、mkdir、touch、more、mv、cp、rm、 wc -l、 tar、 find、 awk、 sed、 grep、 sort。
磁盘系统管理:cd、df –kh、du -sh、ls -lh、pwd、 ps、 netstat
后台执行命令:at,crontab,nohup
文件传输:ftp、scp、sftp、screen
1、cat
含义:cat命令主要用来查看文件内容,创建文件,文件合并,追加文件内容等功能。
用法:
(1)查看内容
-n 或 –number 由 1 开始对所有输出的行数编号
-b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
(2)创建文件,追加文件内容
创建文件的时候要设置文件结束标志,如下 << EOF,可以把EOF换成别的字符,注意是大小写敏感的,当文件内容写完之后输入结束标志EOF,这时命令会正确结束,表示成功创建文件并且写进内容。注意使用>会覆盖原内容,>>可在文件后追加内容
cat>f1.txt<
(3)文件合并
注意>会覆盖原内容,>>可在文件后追加内容。
cat f2.a f3.a f4.a >> f1.a
2、chmod
用法:
注:权限对文件的w权限,不能删除文档
权限对目录的r权限可ls不一定能进入,w权限,可删除该目录下的文档。x权限可进入该文档。
chmod u+x file
//注:u(属主)、g(组)、o(其他)、a(所有) +- r、w、x
chmod 751 file
chmod -R u+r directory
//递归地给directory目录下所有文件和子目录的属主分配读的权限
* 可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
* 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
* 文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限,在u中的x变为s。4
* 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。在g中的x变为s。2
* 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!在o中的x变为t。1
3、chown
chown tx:txgroup file1.txt
//将文件 file1.txt 的拥有者设为 tx,群体的使用者为txgroup。
chown -R tx:txgroup *
//将目前目录下的所有文件与子目录的拥有者设为tx,群体为txgroup。
4、diff
逐行比较两个文件的不同。
* -r:当diff的参数为文件夹时,diff会遍历整个文件夹对新旧文件夹下同名的文件进行比较
* -w:忽略所有空格和制表符,将所有其他空白字符串视为一致。例如,if ( a == b ) 与 if(a==b) 相等。
* -i:忽略字母大小写。例如,小写 a 被认为同大写 A 一样。
* -b忽略空白格差异 -B忽略空白行的差异 -i忽略大小写的不同
比较格式:第一行 c改变 a增加 d删除
接下来 <左边那个文件的内容 >右边那个文件的内容
配合patch制作补丁:
diff a.c b.c > b.patch ; patch a.c b.patch
5、mkdir
mkdir -m 777 test //类似chmod
mkdir -p test/test1 //递归创建目录,若不存在的目录会一并创建
6、touch
修改文件或目录的时间戳、创建文件。
stat 查看时间戳
touch file{1..10} 创建10个文件file1到file10
access访问时间、modify修改时间、change改变权限、大小、属性的时间。
-a 只修改文件的access(访问)时间.
-m 修改Modify(修改)时间,而不修改access(访问)时间
-c 或--no-create 不创建不存在的文件。
-d 使用指定的日期时间,而非现在的时间,如:2019-4-23
-t 将时间修改为参数指定的日期,如:201904231556代表2019年4月23号15点56分
-r file 使用指定file文件的时间戳(access,modify)更新文件的时间戳(access,modify)
7、more
b上一页,空格键下一页,/子串 向下搜索,=输出当前行号,:f输出当前文档名和行号,V调用vim,q退出.
-num 一页显示的行数,要在文档名前
-d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声
-l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示
8、mv
-b 若需覆盖文件,则在覆盖文件前先进行备份
-f 强制覆盖,若目标文件已存在同名文件,使用该参数时则直接覆盖而不询问
-i 若目标文件已存在同名文件,则提示询问是否覆盖
-u 若目标文件已存在需移动的同名文件,且源文件比较新,才会更新文件
-t 先指定mv的目标目录,该选项使用于移动多个源文件到一个目录的情况,此时目标文件在前,源文件在后。
mv -t /tmp/ file1 file2或mv file1 file2 /tmp/
9、cp
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。
拷贝多个文件时用 {}括上
cp /boot/grub/{file1,file2,file3} ./
10、rm
-f 无需确认;-r 递归删除;-i 删除前逐一询问确认。
11、wc
-c 统计字节数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-l 统计行数。
-L 打印最长行的长度。
12、tar
tar czvf file.tar.gz file
tar xzvf file.tar.gz
可以不加-
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。
下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的,已淘汰
-v:显示所有过程
-O:将文件解开到标准输出
参数-f是必须的
-f: 使用档案名字,切记,这个参数放最后,后面只能接档案名。
13、find
形式:find [-path……] -options [-print -exec -ok]
print:表示将结果输出到标准输出。
//find ./ -type d -print -exec ls {} \;
(查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,
没有选项-print时文件列表前一行不会显示目录名称))
exec:对匹配的文件执行该参数所给出的shell命令。
形式为command {} \;,注意{}与\;之间有空格。find的内容在{}中,\转义;。
ok:与exec作用相同,
区别在于,在执行命令之前,都会给出提示,让用户确认是否执行
option常用选项:
-type: find ./ -type f(文件); find ./ -type d(目录)
-name: find ./ -name test //查找文件名为test的文件或目录
//find ./ -name \*.c
-regex: find ./ -regex .*so.*\.gz
-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
-mmin : 同mtime,单位为分钟。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
-empty : 查找空文件或目录 find ./ -empty
//find ./ -empty -type f -print -delete 查找空文件并删除
-perm:按权限查找 mode刚好等于、-mode囊括全部权限、+mode有某权限
find ./ -perm 664
//查找权限为644的文件或目录(需完全符合)
find ./ -perm -664
查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
-user:文件所有者来查找。
-group:
-size: find ./ -size -10c //size小于10个字节的文件或目录,+大于,n等于
find ./ -size 10k //size等于10k的文件或目录,其他单位:M,G
14、awk
含义:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。有点复杂,详情可查看:awk命令详解
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
'' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
如:
awk 'BEGIN {FS="|"} $1==0 {print $0 "\t lines: " NR}'
FS设定分割符,$0表示整个当前行,\t制表符,NR行号。
15、sed
含义:自动编辑一个或多个文件、简化对文件的反复操作
sed '1,2d' test.xx //删除1、2行
sed '/2/d' test.txt //正则表达式是写在 /.../ 两个斜杠中间,包含2的行删除。
sed '1a hello world' test.txt //第一行后增加,改为i则是第一行前增加
sed '1c hello world' test.txt //替换,所有地址修饰可改为正则表达式。如下
sed '/^2/c hello world' test.txt //替换以2开头的行,其内容是c命令后面的字符串
sed '2,$s/aa/AA/g' test.txt // 对第5行直到文件末尾的所有行进行搜索替换操作。s替换,g全局替换否则仅替换第一个。这里的/.2./.3./ 表示用3替换2,前面的2,$也可用正则表达式。
-i 将修改应用到文件中,默认只是输出到终端,并不改变文件。
16、grep
可结合正则表达式使用
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写
-n :输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
17、sort
-b:忽略每行前面开始的空格字符("-n"选项隐含该选项,测试发现都隐含)
-c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序
-C:类似于"-c",只不过不输出任何诊断信息。可以通过退出状态码1判断出文件未排序
-d:只处理英文字母、数字及空格,忽略其他的字符
-f:将小写字母视为大写字母
-h:使用易读性数字(例如:2K、1G)
-i:除了040至176之间的ASCII字符外(八进制0-177),忽略其他的字符(忽略无法打印的字符如退格/换页键/回车)
-k:以哪个区间 (field) 来进行排序
-m:将几个排序好的文件进行合并,只是单纯合并,不做排序
-M:将前面3个字母依照月份的缩写进行排序
-n:依照数值的大小排序
-o<输出文件>:将排序后的结果存入指定的文件
-r:降序
-u:忽略相同行
-t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符
1、cd
cd . 当前目录
cd / 根目录
cd ~ 家目录,直接cd也是家目录
cd .. 上层目录
cd - 上一个工作目录
-p 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
-L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。
2、df
读取的数据针对一整个文件系统,读取的范围主要是在 Superblock 内的信息, 所以命令速度非常的快.
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i :不用硬盘容量,而以 inode 的数量来显示
* Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
* 1k-blocks:说明底下的数字单位是 1KB !可利用 -h 或 -m 来改变容量;
* Used:顾名思义,就是使用掉的硬盘空间啦!
* Available:也就是剩下的磁盘空间大小;
* Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
* Mounted on:就是磁盘挂载的目录所在啦!(挂载点)
3、du(-sh)
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
4、ls
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
5、pwd
-p 连接文件真正的物理位置
-L 不加参的默认选项,逻辑位置
6、ps
ps -u root 显示指定用户信息
ps -l 仅观察自己的bash相关进程
ps -lA观察系统所有进程`
F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
* 若为 4 表示此程序的权限为 root ;
* 若为 1 则表示此子程序仅进行复制(fork)而没有实际运行(exec)。
S:代表这个程序的状态 (STAT),主要的状态有:
* R (Running):该程序正在运行中;
* S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
* D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>列印)
* T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
* Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
UID/PID/PPID:『此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码』
C:代表 CPU 使用率,单位为百分比;
PRI:进程的执行优先权(Priority的简写),其值越小越早被执行;
NI: 这个进程的nice值,其表示进程可被执行的优先级的修正数值。
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
TTY:登陆者的终端机位置,若为远程登陆则使用动态终端介面 (pts/n);
TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;
CMD:就是 command 的缩写,造成此程序的触发程序之命令为何。
ps -ef 显示所有进程信息,连同命令行
ps aux 观察系统所有进程
* USER:该 process 属於那个使用者帐号的?
* PID :该 process 的程序识别码。
* %CPU:该 process 使用掉的 CPU 资源百分比;
* %MEM:该 process 所占用的实体内存百分比;
* VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
* RSS :该 process 占用的固定的内存量 (Kbytes)
* TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
* STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
* START:该 process 被触发启动的时间;
* TIME :该 process 实际使用 CPU 运行的时间。
* COMMAND:该程序的实际命令为何?
7、netstat
追踪网络与插槽档。
-a :将目前系统上所有的连线、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以程序的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的程序 PID
netstat
分两块:网络相关以及本机程序相关
* RefCnt:连接到此 socket 的程序数量;
* Flags :连线的旗标;
* Type :socket 存取的类型。主要有确认连线的 STREAM 与不需确认的 DGRAM 两种;
* State :若为 CONNECTED 表示多个程序之间已经连线创建。
* Path :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。
8、top
字段含义:
VIRT 虚拟内存
RES 常驻内存
SHR 共享内存
DATA 数据占用内存,如果top没有显示,按f键可以显示出来
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
k - 终止进程
i - 忽略闲置和僵死进程
r - 设置进程优先级
默认情况下仅显示比较重要的列,通过 f 键可以选择显示的内容。
按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志
9、free
free -h -s 3 //每隔三秒刷新一次,C-c退出
Mem 内存的使用情况。
Swap 是交换空间的使用情况。
total 显示系统总的可用物理内存和交换空间大小。
used 显示已经被使用的物理内存和交换空间。
free 显示还有多少物理内存和交换空间可用使用。
shared 显示被共享使用的物理内存大小。
buff/cache 显示被 buffer 和 cache 使用的物理内存大小。
available 显示还可以被应用程序使用的物理内存大小。
1、at
一次性任务。/etc/at.allow 文档中的使用者才能使用at。若无该文档会查/etc/at.deny,该文档中的用户不能使用。一个账号一行。
-m :当 at 的工作完成后,即使没有输出信息,亦以 email 通知使用者该工作已完成。
-l :at -l 相当於 atq,列出目前系统上面的所有该使用者的 at 排程;
-d :at -d 相当於 atrm ,可以取消一个在 at 排程中的工作;
-v :可以使用较明显的时间格式列出 at 排程中的工作列表;
-c :可以列出后面接的该项工作的实际命令内容。
-f :从指定文件读入任务,而不是从标准输入读入
atq :查询当前的at任务
atrm 任务号 :删除at
at now + 5 minutes 任务在5分钟后运行
at now + 1 hour 任务在1小时后运行
at now + 3 days 任务在3天后运行
at now + 2 weeks 任务在两周后运行
at midnight 任务在午夜运行
at 10:30pm 任务在晚上10点30分
at 23:59 12/31/2019 任务在2019年12月31号23点59分运行
2、crontab
例行性周期性执行,可编辑 /etc/crontab 来支持,同样有/etc/cron.allow /etc/cron.deny
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
格式:分 时 日 月 周 命令
特殊符号:*代表任何,若日 月 周栏为*,代表无论何日何月何周的某个时刻都执行该命令。
,分隔两个时段,即两个时间点都执行。
-代表范围,如时那段有8-12即八点到十二点的某个时刻都执行。
/num 即每隔num个时间单位,通常为 */5 若出现在分的时间段,即每五分钟执行一次。
周和日月只能选择其中一项循环,不可同时都固定。
3、nohup com &
放至背景工作。
vim下ctrl z暂停放至背景。
jobs观察背景工作状态。
fg %1 将1号背景工作拿到前景处理。
bg让工作在背景下的状态变成运行中。
kill -num PID -9强制删除 -15正常退出,vim不会保存中间缓存文档。
ftp:
mput上传多个文件、mget *.txt下载多个文件、
prompt确认开关,其余参考sftp
sftp:
连接:sftp [email protected]
查看目录: lpwd查看当前服务器路径,pwd查看远程服务器路径
改变目录: lcd改变本机路径,cd改变远程服务器路径
上传文件: put 当前路径 远程路径
下载文件: get 远程路径 当前路径
scp:
本地到远程
scp local_file remote_username@remote_ip:remote_folder
scp local_file remote_username@remote_ip:remote_file
scp local_file remote_ip:remote_folder
scp local_file remote_ip:remote_folder
远程到本地
scp remote_username@remote_ip:remote_folder local_file
scp remote_username@remote_ip:remote_file local_file
scp remote_ip:remote_folder local_file
scp remote_ip:remote_folder local_file
screen:
远程登录窗口,避免远程终端退出而导致程序挂掉。
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
C-a(Control + a) d -> detach,将目前session丢到后台执行
C-a w -> 列出当前所有窗口,标题栏显示:0$ bash 1-$ bash 2*$ bash
这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。