天天看点

Linux学习之工作常用Linux命令

命令行基础入门

命令提示符

​​

​[root@localhost ~]#​

​​ root 当前登录用户名

localhost 主机名

~ 当前所在的目录(即家目录,用户登录的初始位置)

​#​

​ 超级用户的提示符

普通用户提示符为$

&以后台进程方式执行命令。

常用命令行

man

必须要知道以及掌握的一个命令行。在不了解某个命令的用法的时候,首先应该想到使用–help或者-help,或者是他们的简写形式–h/-h来查看命令的使用详情;进一步,如果-help还不行的话,可以使用man命令来查看帮助信息。

帮助文件(man-pages,手册页)一般放在,​​

​$MANPATH/man​

​ 目录下面,而且按照领域与语言放到不同的目录里面。Man 帮助页通过数字标识符来分成不同类型的内容:

  1. 一般用户命令
  2. 系统调用命令
  3. 库函数
  4. 特殊的文件和驱动程序
  5. 文件格式
  6. 游戏和屏保
  7. 杂项
  8. 系统管理命令和守护进程

所有的 man 帮助页都应该显示这些子段落:Name、 Synopsis、 Description、Examples、See、Also。有些还会添加一些额外的子段落,比如 Options、 Exit、Status、 Environment、Bugs、Files、Author、Reporting、Bugs、History、Copyright。

用法:

显示 man 命令的 man 帮助页。具体来说,将先解压 man 帮助页文件(这个文件一般以压缩形式存储在本地磁盘的特定位置),然后解释格式化指令并用 less 显示结果,所以导航操作和在 less 中一样。

​​

​man man​

# 显示passwd帮助文件路径,-a查找所有的压缩文件,默认只会查找一个
man -w passwd
/usr/share/man/man1/passwd.1.gz
man -aw passwd      

rm

Linux学习之工作常用Linux命令

如上图,在拷贝照片之后,有一些重复的文件。想要快捷删除重复的文件可以使用命令行。注意括号需要加上转义字符,否则报错syntax error near unexpected token ‘(’:

​rm -fr "\(1\)."​

​ 注意这种删除,在回收站不会留下记录。

rmdir

类比于mkdir(目录只能在用户拥有写权限的目录下才能创建),创建空目录;

rmdir,用于删除空目录,一个目录被删除之前必须是空的。

​​

​rm – r dir​

​​命令可代替rmdir,但是有很大危险性。

该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限。

​​

​- p​

​​:递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。

​​

​-v, --verbose​

​ 显示指令执行过程。

scp

scp,用于Linux之间复制文件和目录,有从本地复制到远程、从远程复制到本地两种类型。

命令基本格式:​​

​scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2​

​​ 选项:

-v 显示进度,可以用来查看连接,认证,或是配置错误

-C 使能压缩选项

-P 选择端口

-4 强行使用 IPV4 地址

-6 强行使用 IPV6 地址

实例:

# 从本地复制到远程
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_file
scp -r local_folder remote_username@remote_ip:remote_folder
scp -r local_folder remote_ip:remote_folder

# 从远程复制到本地
scp [email protected]:/home/root/others/music /home/space/music/1.mp3
scp -r www.cumt.edu.cn:/home/root/others/ /home/space/music/

# 本地开发时使用,千万不能用于脚本中
scp <user>:<password>@<ip>:/path/ /<des_path>
scp root:iso*[email protected]:/var/opt/kubernetes/offline/suite_images/1.0.tar .
scp root:iso*[email protected]:/var/opt/* /usr/      

解释:

第1,2个指定用户名,命令执行后需要再输入密码;第3,4个没有指定用户名,命令执行后需要输入用户名和密码;

复制时可以保持文件名不变,如1,3;也可以指定新的文件名,如2,4;

复制整个文件夹时,需要添加-r选项。

tail

tail 命令用于显示指定文件(-f 选项)末尾最后10行内容并不断刷新,如果没有指定文件,则会使用标准输入。常用于查看日志文件。

常用选项:

-f 循环读取

-F same as --follow=name --retry

-v 显示详细的处理信息

-c, --bytes=[+]NUM 显示的字节数

-n, --lines=[+]NUM 显示行数

–pid=PID 与-f合用,表示在进程ID,PID死掉之后结束。

-q, --quiet, --silent 从不输出给出文件名的首部

-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒。

示例:

# 显示文件末尾最后5行内容,-5等同于5,默认从末尾显示文件;+5表示从第5行开始显示文件
tail -n 5 log2014. log
tail -n +5 log2014.log
逆序显示行
tail [  -r ] [  -n Number ] [ File ] 
Number 变量指定将多少单元写入标准输出。 Number 变量的值可以是正的或负的整数。如果值的前面有 +,从文件开头指定的单元数开始将文件写到标准输出。- 则表示从文件末尾指定的单元数开始将文件写到标准输出。默认从文件末尾指定的单元号开始读取文件。 

Number 变量用于确定计数的起点的单元类型由 -b、-c、-k、-m 以及 -n 标志确定。如果没有指定其中的任何一个标志,那么 tail 命令就会读取指定文件的最后十行,并将其写到标准输出。这与在命令行输入 -n 10 是相同的。 

-m 标志在单字节和双字节字符环境中提供一致的结果。当输入是包含多字节字符的文本文件时应谨慎使用 -c 标志,因为产生的输出可能不从字符边界开始。 

标志
-b Number 从 Number 变量表示的 512 字节块位置开始读取指定文件。 
-c Number 从 Number 变量表示的字节位置开始读取指定文件。 
-f 如果输入文件是常规文件或如果 File 参数指定 FIFO(先进先出),那么 tail 命令不会在复制了输入文件的最后的指定单元后终止,而是继续从输入文件读取和复制额外的单元(当这些单元可用时)。如果没有指定 File 参数,并且标准输入是管道,则会忽略 -f 标志。tail -f 命令可用于监视另一个进程正在写入的文件的增长。 
-k Number 从 Number 变量表示的 1 KB = 1024 B 块位置开始读取指定文件。 
-m Number 从 Number 变量表示的1 048576 B =1 MB 多字节字符位置开始读取指定文件。使用该标志提供在单字节和双字节字符代码集环境中的一致结果。 
-n Number 从 Number 变量表示的行位置开始读取指定文件。 
-r 从文件末尾以逆序方式显示输出。-r 标志的缺省值是以逆序方式打印整个文件。如果文件大于 20,480 字节,那么 -r 标志只显示最后的 20,480 字节。 
-r 标志只有与 -n 标志一起时才有效。否则,就会将其忽略。 
退出状态
该命令返回下列的退出值: 
0成功完成。 
>0出现错误。 
示例
要显示 notes 文件的最后十行,输入: 

tail notes要指定从 notes 文件末尾开始读取的行数,输入: 
tail  -n 20 notes 
要从第 200 字节开始,每次显示一页 notes 文件,输入: 
tail  -c +200 notes | pg      

zip & tar & jar etc.

zip格式已成为压缩文件的标准选择,最大优势适用于不同的操作系统平台,缺点是支持的压缩率不是很高。

tar命令,仅仅是打包,命令本身没有压缩功能,.tar.gz与.tar.bz2都是在tar命令中调用别的压缩命令实现一个压缩的功能,实际是实行一个先打包后压缩的过程,.tar.gz与.tar.bz2只是公认的一个通行后缀而已,并不是一种压缩格式,真正实现压缩的是gzip与bzip2,tar.gz在很多时候,也会被简写成tgz,分别使用z、j选项;前者生成后缀名为.tar.gz文件,在压缩时不会占用太多CPU的,而且可以得到一个非常理想的压缩率。后者生成后缀名.tar.bz2文件,压缩率好,占用更多的CPU与时间。Tar的好处就是它只消耗非常少的CPU以及时间去打包文件,仅仅只是一个打包工具,并不负责压缩。

另外,java自带的jar命令行工具也有打包功能。

# zip压缩
zip -r a.zip directory_to_compress
# tar压缩
tar -cvf a.tar directory_to_compress
# tar解包
tar -xvf a.tar
# 将文件夹hpas-7.4.3下的所有文件生成tar.gz格式的压缩包,带不带-符号无所谓
tar czf hpas-7.4.3.tar.gz hpas-7.4.3/
# 解压一个tar.gz归档,x - 解压文件,v - 冗长模式,在解压每个文件时打印出文件的名称,z - gzip算法压缩的文件(后缀名.tar.gz),j - bzip算法压缩(后缀名.tar.bz2),f - 使用接下来的tar归档来进行操作,C-将文件解压到一个指定的目录或路径(需要事先存在的目录)
tar -xvzf tarfile.tar.gz
# .tar.bz2 格式文件的解压命令为
tar -jxvf xx.tar.bz2
# .bz2 (和上面的不一样,并不是tar.bz2,仅仅是text.bz2 文件)格式文件的解压
bunzip2 text.bz2
# 作为对比记忆,压缩文件为bz2格式的命令为
bzip2 -d text.bz2
# 提取文件,支持通配符--wildcards
tar -xzf abc.tar.gz "./new/abc.txt" "a.txt"
tar -xzf abc.tar.gz --wildcards "*.txt"

# 在固定的时间间隔内来备份目录,tar命令可以通过cron调度来实现这样的一个备份:
tar -cvz -f archive-$(date +%Y%m%d).tar.gz ./new/
使用cron来运行上述的命令会保持创建类似以下名称的备份文件 :'archive-20150218.tar.gz'      

类似的命令:gzip, zcat 或者 compress。

jar 命令详解

​​

​jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...​

​​ 其中 {ctxui} 是 jar 命令的子命令,每次 jar命令只能包含 ctxu中的一个;

解压到当前目录

​jar -xvf project.war​

​ 解压war包里面的指定目录(支持正则模式)到当前目录,下面命令仅仅解压axis2*文件夹到当前目录

​jar -xvf axis2.war axis2​

ls

# -a显示隐藏文件,-l显示详情
# 统计某文件夹下文件的个数
ls -l |grep "^-"|wc -l
# 统计某文件夹下目录的个数
ls -l |grep "^d"|wc -l
# 统计文件夹下文件的个数,包括子文件夹里的
ls -lR | grep "^-"|wc -l
# 统计当前目录(包含子目录)下的所有java文件个数
ls -lR |grep java|wc -l
# 统计指定目录(包含子目录)下的所有java文件个数
ls -lR /root/github/ |grep java|wc -l
ls -lR "/root/github/" |grep "java"|wc -l
# 统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l
总结:-R表示含目录,递归;
"^d"即表示文件夹,folder;
"^-"即表示文件,file,Linux下一切皆文件。      

curl

用来通过 HTTP(s),FTP 等其它几十种协议来发起网络请求。可以下载文件,检查响应消息头以及方便地访问远程数据。

在 Web 开发中, Curl 经常被用来测试连接,还有调用 REST 风格的 API。

​​

​curl -I <url>​

​​:获取 request header

有许多选项可以用来控制消息头,Cookie,身份验证等这些要素。Everything curl 电子书

ln

Unix 里面的链接同 Windows 中的快捷方式类似,允许你快速地访问到一个特定的文件。通过 ln 命令创建链接,有两种类型 : hard & symbolic。每种类型都有不同的属性而且各有其用途。

​​

​ln -s /some/scripts/under/some/very/deep/directory/ /usr/local/bin/​

​ 创建一个 symlink,将 Scripts 文件夹链接到 /usr/local/bin,这样就能让脚本在所有的目录下面都可以执行。

lsblk

列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。​

​lsblk -l​

​命令以列表格式显示块设备(而不是树状格式)。一般用于了解新插入的USB设备的名字,特别是当你在终端上处理磁盘/块设备时。

history

用于查找命令执行历史;重复执行上一次命令可以按⬆️键,重复执行之前执行的某一条命令可以使用history。

history 10显示最后的10条命令:

526 ls web/

527 clear

528 ls -a

529 history 10

530 date

531 make -v

532 sudo apt-get --help

533 history 10

534 gcc -v

535 history 10

​​

​!n​

​​:这个n表示序号,重新执行第528条命令ls -a,那么你可以使用​

​!528​

​​;

​​

​!!​

​​:这将会重新执行上一条命令;

​​

​!?String?​

​​:Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。比如:输入​

​!?gc?​

​​第534条命令​

​gcc -v​

​​就会执行。

​​

​CTRL + R​

​​:搜索已经执行过的命令,它可以在你写命令时自动补全。

​​

​fc n​

​​:打开文本编辑窗口并显示这条命令。然后你可以编辑修改这条命令。退出编辑窗口执行命令。

因为,在shell(控制台、终端)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中。默认保存1000条,可更改。

待验证:

​​

​<空格> 命令​

​不会被记录到history 命令,Windows安装git bash之后,经过验证并不是这样;另一个命令cat | bash也不会被history记录。

cat & more & less

cat,连结Concatenation,连接两个或者更多文本文件或者以标准输出形式打印文件的内容。

​​

​cat 1.txt 2.txt 3.txt​

​​

​cat 1.txt 2.txt 3.txt >>123.txt​

​ “>>”和“>”调用追加符号。它们用来追加到文件里,而不是显示在标准输出上。“>”符号删除已存在的文件,创建一个新的文件。“>>”不覆盖或者删除使用追加模式。

cat,连续显示、查看文件内容;

more,分页查看文件内容;

less,分页可控制查看文件内容。

chmod

改变文件的模式位。3种类型的权限:Read ®=4,Write(w)=2,Execute(x)=1;3种用户/用户组权限:拥有者,用户所在的组,其它用户,比如​

​ls -l​

​​查看得到​

​*.sh​

​​文件的权限详情:​

​-rwxr-xr-x 1 johnny 197609 268 Jan 4 2017 enable-dw-etl-tool.sh*​

​​。更改:​

​chmod 777 enable-dw-etl-tool.sh​

​;

chown

chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。每个文件都属于一个用户和用户组。还是上面的例子,文件enable-dw-etl-tool.sh属于用户johnny和用户组197609(Windows系统的输出,待研究);文件的owner及group和权限紧密相连。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。

选项:

-v 显示详细的处理信息;

-f 忽略错误信息;

-R 处理指定目录以及其子目录下的所有文件;

更新用户:​​

​chown johnny enable-dw-etl-tool.sh​

​​ 更新用户以及用户组:​

​chown johnny:johnny enable-dw-etl-tool.sh​

chgrp

更改文件的group。chgrp=change group;被更改后的group_name必须是本机上一个真实存在的group,否则会报错。

umask

默认情况下,新建一个文件是不需要具有可执行权限的。因此对于文件而言,其默认的最大权限就是666,表示对于文件拥有者、同个群组的其他用户和不同群组的其他用户都具有可读和可写权限。

对于目录而言,可执行权限与用户是否能进入该目录有关,因此默认情况下,目录的所有权限都对外开放,即默认的最大权限为777,表示对于文件拥有者、同个群组的用户和不同群组的其他用户都具有可读、可写和可执行权限。

​​

​umask​

​​命令查看当前用户的umask值,输出:​

​0022​

​​,4位数。第一位是特殊权限相关的。

umask的值表示的是文件或目录的“默认最大值”需要减掉的权限。由于文件的默认最大权限为666,第二位是0,表示是不需要减掉任何权限,因此对于文件拥有者而言,而权限就是6;第三位为2,表示的是需要减掉可写权限,因此对于同个群组的其他用户而言,其权限就是4;第四位是2,表示需要减掉可写权限,因此对于不同群组的其他用户而言,其权限就是4。故0022表示的是该用户新建的文件的默认权限是644。

命令用来指定当前用户在新建文件时的默认权限,其是一个数值。

只要在umask命令后面加上要设置的umask值就行了。比如我们要设置创建的文件的默认权限为664,即对于文件拥有者和同个群组的用户而言,不需要减掉任何权限,而对于不同群组的其他用户需要减掉可写权限,因此umask值为002。接下来我们设置umask值为002来验证一下:

root@study-machine:~/work# umask 002

root@study-machine:~/work# umask

0002

root@study-machine:~/work# touch file3

root@study-machine:~/work# ls -al

total 8

drwxr-xr-x 2 root root 4096 Apr 25 21:28 .

drwx------ 7 root root 4096 Apr 25 21:28 …

-rw-rw-r-- 1 root root 0 Apr 25 21:28 file3

将umask值设置为002后,新建的文件file3的默认权限为-rw-rw-r–,即664,与一开始的默认权限明显不同,可以通过umask值设置文件或目录的默认权限。

对于目录而言,则有些不同,还是以umask值0022为例进行分析。目录的默认最大权限是777,第二位为0,表示的是不需要减掉任何权限,所以对于目录拥有者而言,其权限为7;第三位为2,表示的是需要减掉可写权限,因此对于同个群组的其他用户而言,其权限是可读可执行,即5;第四位为2,表示的是需要减掉可写权限,因此对于不同群组的其他用户而言,其权限是可读可执行,即5。故0022表示的是该用户新建一个目录的默认权限为755。我们新建一个目录验证一下便知:

root@study-machine:~/work# ls

root@study-machine:~/work# umask

0022

root@study-machine:~/work# mkdir dir1

root@study-machine:~/work# ls -al

total 12

drwxr-xr-x 3 root root 4096 Apr 25 21:46 .

drwx------ 7 root root 4096 Apr 25 21:46 …

drwxr-xr-x 2 root root 4096 Apr 25 21:46 dir1

目录dir1的权限为drwxr-xr-x,即755,与上述分析的一致。

apt

Debian系列(Ubuntu,Kubuntu等)以apt(Advanced Package Tool)命令为基础,高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。需要root权限(提示符为"#",而不是“$”);和yum命令相比,Apt更高级和智能。

apt-get install mplayer
apt-get autoremove
# 在包安装时自动构建依赖关系
apt-get build-dep ffmpeg
apt-get update      

apt-cache用来搜索包中是否包含子包mplayer, apt-get用来安装,升级所有的已安装的包到最新版。

sudo

sudo 允许用户借用超级用户的权限,​

​su​

​​命令实际上是允许用户以超级用户登录。sudo比su更安全。

sudo=super user do,命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

​​

​sudo add-apt-repository ppa:tualatrix/ppa​

​​

​sudo !!​

​,执行某条命令发现没有权限,输入​

​sudo !!​

​命令重新以root权限执行这个命令。

clear

清除屏幕;Ctrl + l,有同等功能。

tty

输出tty,win 10 git bash 输出​

​/dev/pty1​

​。

at

与cron 命令相似,也可用于安排一个任务或者在某个特定时刻执行命令。at会在系统时间匹配到特定时间时会尽快执行。win 10系统输出:AT 命令已弃用。请改用 schtasks.exe。不支持该请求。

# echo “ls -l”,将这串命令(ls -l)输出在标准终端上
# > :重定向输出,/dev/pts/0: 输出设备和/或文件,输出到指定的地方,这里输出在终端(/dev/pts/0)
echo "ls -l > /dev/pts/0" | at 14:012
echo "ls -l > /dev/pts/0" | at 2:12 PM      

last

显示上次登录用户的历史信息,通过搜索文件“/var/log/wtmp”,显示logged-in和logged-out及其tty‘s的用户列表。

dd

转换和复制文件,大多数情况下是用来复制iso文件到一个usb设备中去,可以用来制作USB启动器。

​​

​dd if=/home/user/Downloads/debian.iso of=/dev/sdb1 bs=512M; sync​

​​ usb设备就是sdb1(你应该使用lsblk命令验证它,否则你会重写你的磁盘或者系统),请慎重使用磁盘的名,切忌。

dd 命令在执行中会根据文件的大小和类型 以及 usb设备的读写速度,消耗几秒到几分钟不等。

du

以可读的形式输出当前目录的子目录的大小。

# 仅仅过滤输出当前目录的文件夹信息
du -h --max-depth=1
# 查看当前目录下所有文件和目录大小,并排序
du -shk * |sort -nr
# 对目录大小排序
du -hk --max-depth=1 |sort -nr
# 只显示排序后的前4个目录
du -hk --max-depth=1 |sort -nr |head -4      

df

Disk Free,返回关于可用磁盘空间的各种信息(与 du 正好相反)。

​​

​df​

​​输出以kb为展示单位,​

​df -h​

​输出根据实际占用情况选择展示单位,如MB和GB等;

di

比df更高级,一个用户实际的磁盘可用空间,以及各种有用的显示格式等。di默认输出即等价于​

​df -h​

​。选项-A输出极详细的打印挂载点,特殊设备名称等。-a打印所有挂载设备。-c用逗号或者其他符号作为值的分隔符。-g、-k、-m分别显示千兆字节(G)、千字节(K)和兆字节(M)。-n 选项跳过标题行的输出。-t 选项在文件系统列表底下再打印一行总计行。

# -l选项显示特定的文件系统类型的相关信息,如tmpfs文件系统
di -I tmpfs
# -s排序,默认按照挂载点名称排序;可以指定排序方式:r逆序,m按照挂载点名称排序(默认),n不排序(即按照在挂载表/etc/fstab中的顺序),s按照特殊设备名称,t按照文件系统类型,排序方式可以组合使用
# 按照类型、设备、挂载点逆序排序
di –stsrm
# 按照类型、设备逆序、挂载点逆序排序
di –strsrm
# -f 选项指定输出格式,-fm,打印挂载点的名称, -ft打印文件系统的类型      

free

显示Linux系统中物理内存、交换分区的使用统计信息。当前系统的可用内存=free + buffers + cached。​

​free​

​命令输出:

total       used       free     shared    buffers     cached
Mem:       2071588     514824    1556764          0     109580     228060
-/+ buffers/cache:     177184    1894404
Swap:      4161528          0    4161528      

物理内存使用统计:

标题 说明
total 物理内存总量 total = used + free
used 已使用内存总量,包含应用使用量+buffer+cached
free 空闲内存总量
shared 共享内存总量
buffers 块设备所占用的缓存
cached 普通文件数据所占用的缓存
available 当前可用内存总量(可用于分配给应用的,不包含虚拟内存)

对于available字段,在内核3.14中,它会从/proc/meminfo中的MemAvailable读取,在内核2.6.27+的系统上采用模拟的方式获取,其它情况下直接与free的值相同。

第二行-/+ buffers/cache 中只有两列used和free有值,它们是物理内存的调整值;used,已使用内存used减去buffer和cached之后的内存,也就是应用正在使用的内存总量;free,空闲内存加上buffer和cached之后的内存,也就是真正的可用内存总量。

第三行为交换分区使用统计,total 交换分区内存总量,used 正在使用的交换分区内存,free 空闲交换分区内存。

解读

下面情况说明内存过低:

  • 可用内存(free+buffers/cache)过低,接近于0的时候
  • 交换分区内存占用swap used增加或者有波动
  • dmesg | grep oom-killer显示有OutOfMemory-killer正在运行

系统正常:

  • 空闲内存free接近于0
  • 已使用内存used接近于total
  • 可用内存(free+buffers/cache)占total的 20% 以上
  • 交换分区内存 swap 没有发生改变

选项:

-b/k/m/g 以bytes/KB/MB/GB为单位显示结果

-h,以人类可读的方式输出统计结果

-t,多显示一行标题为Total的统计信息

-o,禁止显示第二行的缓冲区调整值

-s,每隔多少秒自动刷新结果

-c,与-s配合使用,控制刷新结果次数

-l,显示高低内存的统计详情

-a,显示可用内存

touch

touch 命令用于创建空文件,以及更改 Unix系统文件时间戳,包括访问以及修改时间。如果文件已经存在,更新时间戳,不会改变文件内容。会强制Linux系统在下次启动时检查文件系统。

# 批量创建空文件
touch readme-{1..5}.txt
# 使用 -c 选项,文件存在则更改文件的访问时间,并不存在则不创建文件。
# 每当使用 touch 命令更改文件和目录的访问和修改时间时,将使用当前时间。使用-t选项设置特定的日期和时间设置为文件的访问和修改时间。日期和时间可以使用以下格式指定:{CCYY}MMDDhhmm.ss。使用 -d 选项指定日期字符串
touch -c -t 202510191820 devops.txt
touch -c -d "2010-02-07 20:15:12.000000000 +0530" sysadm-29.txt
# -r选项,使用参考文件设置时间戳,参考readme-1.txt的时间戳设置devops.txt的时间戳:
touch -r readme-1.txt devops.txt
#  -m 选项更改文件和目录的修改时间,使用stat命令来验证修改时间是否改变;
touch -m devops.txt
# -a 选项更改文件或目录的访问时间
# 默认情况下,每当尝试使用 touch 命令更改符号链接文件的时间戳时,它只会更改原始文件的时间戳。如果你想更改符号链接文件的时间戳,则可以使用 touch 命令中的 -h 选项来实现。      

alias

为长命令创建一个短别名。终端关闭后,别名失效。将 alias 命令操作写到你的 .bashrc 文件中使其永久生效。

uname

Unix Name简写。显示机器名,操作系统和内核的详细信息。uname显示内核类别, uname -a显示详细信息

cal

cal=Calender,用来显示当前月份或者未来或者过去任何年份中的月份,最小单位是月。

显示已经过去的月份,1990年4月:​​

​cal 041990​

date

使用标准的输出打印当前的日期和时间,也可以深入设置,需要root权限,因为涉及系统整体改变。

# 命令选项
-d<字符串>  显示字符串所指的日期与时间。字符串前后必须加上双引号。 
-s<字符串>  根据字符串来设置日期与时间。字符串前后必须加上双引号。 
-u  显示GMT。
# 最基本的显示,一个加号后接数个标记
date
date '+%c'
date '+%D'
date '+%x'
date '+%T'
date '+%X'
date  '+%B %d'
# 显示前一天的日期
date +%Y%m%d --date="+1 day"
# 设置当前时间,只有root权限才能设置,其他只能查看
date -s
# 设置
date --set='14 may 2013 13:57' Mon May 1313:57:00 IST 2013      

locate

用于查找文件,比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作crontab程序来建立。即先运行:updatedb(无论在那个目录中均可,可以放在crontab中 )后在 /var/lib/slocate/ 下生成 slocate.db 数据库即可快速查找。

mount

命令列出所有挂载文件系统,命令​

​mount | colum -t​

​以格式化的形式输出。

file

输出文件信息。命令​

​file 2.txt​

​​,输出:​

​2.txt: very short file (no magic)​

md5sum

计算和检验MD5信息签名,用来检查文件的完整性。md5 checksum(哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。md5sum没有sha1sum安全;将生成的字符串(32位数字和小写字母的组合)与原作者提供的进行比较。

​​

​md5sum <file_name>​

sha1sum

pkill

pidof打印出正在运行的程序的进程ID:​

​pidof nginx​

​​ 通过kill命令杀死nginx:​

​kill -USR2 $(pidof nginx)'​

​ pkill是一个快捷命令,可以依据匹配模式杀死进程:​

​pkill -f nginx​

getconf

# 查看所有配置
getconf -a
# 显示机器架构位数
getconf LONG_BIT      

tee

分割程序的输出,从而可以打印和保存。例如,添加一个新的条目到hosts文件;

​​

​echo "127.0.0.1 foobar" | sudo tee -a /etc/hosts​

dialog

在命令行上与用户交互的一种非常简单又良好的方式。下面命令展示一个不错的输入框:

​​

​dialog --title "Oh hey" --inputbox "Howdy?" 8 55​

​ 支持许多其他类型的对话框;消息框,菜单,确认,进度条…

screen

当采用telnet或SSH登录远程主机时,因为网络中断等原因会导致session终止,此时会触发SIGHUP信号使得任务终止,因此常常会看到有些任务采用nohup的方式运行,避免任务被打断。screen通过多终端的方式,能在不同会话间断开或重连。

​​

​screen -S test​

​​开启一个screen,这时拥有一个终端,所有执行的程序都会在ps中展示,Ctrl+a键+d键,退出当前screen断开连接,切到上级窗口、

​​

​screen -ls​

​​查看所有screen列表,如

13333.test (Detached)

14039.test4 (Detached)

表示两个screen,screen标识为13333.test和14039.test4

​​

​screen -r [pid.]tty.host​

​​ 重新进入选定的screen:​

​screen -r 13333.test​

tac

倒序输出文本文件的内容,从最后一行到第一行。

id

打印真正的和有效的用户和组的id。Windows git bash输出:​

​uid=197609(johnny) gid=197609 groups=197609​

nl

​nl 1.txt​

​,以添加行号的方式来显示文件。

lsb_release

打印特殊发行版的信息。选项-a显示有关版本、ID、详情、发行号和研发代号的全部可用信息。

bind

显示所有的BASH shell可用的快捷方式。
bind -p      

tmux

Tmux 是一个终端复用器,一个可以将多个终端连接到单个终端会话的工具。

它让你可以在一个终端中进行程序之间的切换,添加分屏窗格,还有就是将多个终端连接到同一个会话,使它们保持同步。 当你在远程服务器上工作时,Tmux 特别有用,因为它可以让你创建新的选项卡,然后在选项卡之间切换,而无需反反复复的退出然后登录。

代替screen、nohup。

fmt

格式化某个文本文件中每一个段落内容,将结果写到标准输出。比如该文本文件每行一个单词,而任务是把所有的单词都放在同一行。

基本语法为:​​

​fmt [-WIDTH] [OPTION]... [FILE]...​

​,-WIDTH 是 --width=DIGITS缩写。

无任何选项,将文本内容格式成同一行输出,不修改原文件
-w 接受一个表示新行宽的数字作为参数值;默认 fmt 输出最大行宽为75
-t 让第一行的缩进与众不同,突出显示;
-s 拆分长行方便查看;
-u 在单词与单词之间用单个空格分开,句子之间用两个空格分开,默认开启;      

tree

以树状的格式递归得到当前文件夹的结构。用于快速地进行浏览并找到自己想要的文件。支持类正则表达式的模式来对结果集进行过滤:​

​tree -P '*.min.*'​

​​。

只显示目录:​​

​tree -d​

shellcheck

shell脚本静态检查工具,能够识别语法错误以及不规范的写法:​

​shellcheck test.sh​

chroot

在给定的目录中打开一个新的TTY。这意味着,你可以创建一个文件夹,在其中设置一个新的Linux系统,并随时切换到该“子系统”。

jq

json文件处理,格式化显示,支持高亮,可以替换​

​python -m json.tool​

​​:

​​

​cat demo.json | jq '.id, .name, .status, .attachments'​

cloc

代码统计工具,能够统计代码的空行数、注释行、编程语言。

​​

​cloc --exclude-dir=font,img --not=match-f='(easyui)|(jquery)' --categorized=categorized_files.txt​

expr

终端简单计算:​

​expr 2 \* 9​

factor

因数分解,不输出1:​

​factor 22​

shuf

Shuf命令随机从一个文件或文件夹中选择行/文件/文件夹。

# 从当前文件夹目录随机选择一个文件打印,n1替换成n2输出两个随机选择
ls | shuf -n1
# 从文件1.txt内容随机选择行打印输出
ls | shuf 1.txt      

apropos

按照功能搜索命令。比如,apropos build filesystem 将会返回一系列名字和描述包括 “build” 和 “filesystem” 单词的工具。apropos 命令接受一个或多个字符串作为参数,-r 参数通过正则表达式来搜索。

pdftk

需额外安装,用来合并几个PDF文件:​

​pdftk 1.pdf 2.pdf 3.pdf …. 10.pdf cat output merged.pdf​

​。

tig

字符模式下交互查看git项目,可以替代git命令。

mycli

MySQL客户端,支持语法高亮和命令补全,效果类似ipython,可以替代MySQL命令。

yapf

Google开发的python代码格式规范化工具,支持pep8以及Google代码风格。

mosh

基于UDP的终端连接,可以替代ssh,连接更稳定,即使IP变更,也能自动重连。

fzf

命令行下模糊搜索工具,能够交互式智能搜索并选取文件或者内容,配合终端ctrl-r历史命令搜索简直完美。

PathPicker(fpp):在命令行输出中自动识别目录和文件,支持交互式,配合git非常有用。

运行以下命令:git diff HEAD~8 --stat | fpp

htop: 提供更美观、更方便的进程监控工具,替代top命令。

axel

多线程下载工具,下载文件时可以替代curl、wget。

axel -n 20 http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

sz/rz

交互式文件传输,在多重跳板机下传输文件非常好用,不用一级一级传输。

ccache

高速C/C++编译缓存工具,反复编译内核:gcc foo.c,改成:ccache gcc foo.c

neovim

替代vim。

script/scriptreplay

终端会话录制。

# 录制开始
script -t 2>time.txt session.typescript
# your commands
# 录制结束
exit
# 回放
scriptreplay -t time.txt session.typescript      

you-get

非常强大的媒体下载工具,支持 YouTube、google+、优酷、芒果TV、腾讯视频、秒拍等视频下载。

pbcopy/pbpaste:

mac专有,把命令行输出拷贝到系统粘贴板:​

​cat test.sh| pbcopy​

​​ 把系统粘贴板内容拷到终端:​

​pbpaste​

say

mac下命令,支持多种语言(英语、普通话、粤语)文本朗读,支持各种销魂恐怖的语气:

​​

​for i in​

​​say -v ‘?’ | cut -d ’ ’ -f 1​

​; do echo $i && say -v "$i" 'Hello World';done​

foremost

foremost是一款根据文件头,尾和内部结构来尝试从镜像文件(或者磁盘)中恢复文件的工具。默认可以扫描出 jpg, gif, png, bmp, avi, exe, mpg, mp4, wav, riff, wmv, mov, pdf, ole, doc, zip, rar, html, cpp 文件。通过配置文件(默认为 /etc/foremost.conf),你还可以为它增加新的支持类型。

安装:​​

​sudo pacman -S foremost​

​​ 扫描文件:​

​sudo foremost -t 文件类型 -i 磁盘/镜像文件​

​ 误删一个 png 文件,运行​

​sudo formost -t png -i /dev/sda1​

​,扫描 /dev/sda1 分区,尝试查找其中的 png 文件,并将这些 png 文件保存到当前目录下的 output 目录中。-o 选项来指定存放文件的目录,但要注意,这个目录需要是空的。

​sudo formost -t png -i /dev/sda1 -o /tmp/png​

​ 使用 T 选项让foremost自动根据当前时间戳来生成output目录,这时生成的目录是类似这样的 output_Thu_Mar__8_11_43_40_2018

​sudo formost -t png -i /dev/sda1 -T​

​ 使用 -q 来加快磁盘或镜像文件的扫描速度,foremost 会仅仅在每个扇区的开始位置与文件头进行对比,这会极大地减少扫描时间,但可能会丢失一些嵌套在其他文件内的文件(比如嵌套在doc文件中的图片)。

​sudo formost -q -t png -i /dev/sda1 -T​

​ 与 -q 常连用的是 -b number, 它可以指定磁盘每个扇区的大小,默认是512个字节。但对于 ext4 文件系统来说,这个值一般是4096.

sudo formost -q -b 4096 -t png -i /dev/sda1 -T

具体文件系统的扇区大小是多少,可以通过 dumpe2fs 来查看

sudo dumpe2fs /dev/sda1 |grep “Block size” |cut -f2 -d “:”

写一个脚本将 foremost 和 dumpe2fs 结合起来实现快速扫描。

TYPE=$1
DIR=$2
fs=$(df  ${DIR}|tail -n 1 |cut -f 1 -d " ")
block_size=$(sudo  dumpe2fs ${fs} |grep "Block size" |cut -f2 -d ":")
foremost -t ${TYPE} -q -b ${block_size} -i ${fs} -T      

参考:

继续阅读