必须掌握的100+个Linux命令大全【持续更新中】

文章目录

别有一番风趣的alias

刚刚好合适的 apropos 命令

迷你计算器 bc

可看黄道吉日的 cal

可看黄道吉日的 cal

查看庐山真面貌的cat

… note::
此去经年,应是良辰好景虚设
宋 柳永《雨霖铃》

cat命令可用于输出文件的内容到标准输出。

cat的官方定义为:

concatenate files and print on the standard output

翻译过来就是:把档案串连接后传到基本输出

其用法一般为:

$ cat [OPTION]... [FILE]...

cat命令的可选参数[OPTION]如下所示:

  • -n--number: 由 1 开始对所有输出的行数编号
  • -b--number-nonblank: 和 -n 相似,只不过对于空白行不编号
  • -s --squeeze-blank :当遇到有连续两行以上的空白行,就代换为一行的空白行
  • -T--show-tabs:显示TAB字符,显示为^I
  • -E--show-ends:显示行末符号,字符为$
  • -A--show-all:显示所有的信息

此时假定我们的文件为hello.c,内容为最经典的:

#include <stdio.h>

int main(int argc, char * argv[])
{
    printf("Hello World\n");
    
    return 0;
}

接下来的实例全部根据这个文件展开,Hello World. Hello Linux

实例 :简单显示内容

$ cat hello.c 

#include <stdio.h>

int main(int argc, char * argv[])
{
	printf("Hello World\n");
	        
	return 0;
}

实例 :显示行号 -n

$ cat -n hello.c 

     1	#include <stdio.h>
     2	
     3	int main(int argc, char * argv[])
     4	{
     5		printf("Hello World\n");
     6		        
     7		return 0;
     8	}

实例 : 显示行末

$ cat -E hello.c 
#include <stdio.h>$
$
int main(int argc, char * argv[])$
{$
	printf("Hello World\n");$
	        $
	return 0;$
}$

实例:显示空白字符

cat -T hello.c 
#include <stdio.h>

int main(int argc, char * argv[])
{
^Iprintf("Hello World\n");
^I        
^Ireturn 0;
}

此时可以看到^I,which means Tab charcter.

加一个管道

比如,此时希望看到你的源码文件一共多少行,每行代表什么意思,就可以把含有行号的输入通过管道发送到另外一个文件,如下所示:

$ cat -n hello.c > hello_number.c

$ cat hello_number.c 

     1	#include <stdio.h>
     2	
     3	int main(int argc, char * argv[])
     4	{
     5		printf("Hello World\n");
     6		        
     7		return 0;
     8	}

其他的一些选项可以自行尝试。

探索未知世界的cd

… note::
月桥花院,琐窗朱户,只有春知处。
宋 辛弃疾《青玉案·元夕》

cd 命令应该是除了 ls 命令外用的最多的命令了。除非你大门不出二门不迈,做个大家闺秀。

cd 命令的含义为

cd - change directory

可以让我们访问不同的文件夹。

最简单的用法为:

$ cd /the/path/you/want/to/go/

接下来说一些技巧,让效率加倍。

让cd命令对参数大小写不敏感

如果你需要同时显示大写和小写的目录名(即便是你给的参数只是小写的),执行下面的bind命令,此时就可以避免Linuxlinux的尴尬。

$ bind "set completion-ignore-case on"

进入刚才的目录

想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:

$ cd

快速返回家目录

需要快速地回到你的家目录,输入cd即可,这里其实不用一级一级的进入

$ cd

进入某用户的家目录

这个需要你有root权限

cd ~username

进入username的家目录。

这些是一些比较基础和入门的,还有一些高级一点的,这些技巧可能用的比较少,不过也是很有帮助的。

结合CDPATH的妙用

变量CDPATH定义了目录的搜索路径:

$ export CDPATH=/the/path/you/add/:/another/path/

现在,不用输入cd /the/path/you/add/hello/ 这样长了,我可以直接输入下面的命令进入 /the/path/you/add/hello/

$ cd html

!$

这个命令目测,用的人不多,其实比较有用,且有效。

$ cd !$

表明的意思是将上一个命令的参数作为cd的参数来使用。

用shopt –s cdspell自动纠正cd命令的目录名输入错误

使用shopt -s cdspell可以自动修正cd时拼写错误的目录名。

如果你在输入时经常犯些错误,这个命令是很有用的。详见以下示例:

# cd /etc/mall

-bash: cd: /etc/mall: No such file or directory

# shopt -s cdspell

# cd /etc/mall

# pwd

/etc/mail

注: 当我错误的把mail敲成了mall,用这个命令mall就自动被换成了mail

有所依靠的chgrp

… code::
鸿鹄志、向炎天。
宋 刘克庄《贺新郎·杜子昕凯歌》

Linux的chgrp命令用于变更文件或者目录所属的组group。

这里的变更不仅限于本人的组,只要用户属于的组,均可以使用chgrp更改相应的权限而不是必须使用管理员权限。

很多权限的操作可以与chmod来交叉。比如如果希望文件只有本组成员访问,可以通过chmod 770 file/directory,此时就涉及到组的概念了。

官方定义为:

chgrp - change group ownership

语法为:

$ chgrp [OPTION]... GROUP FILE...
$ chgrp [OPTION]... --reference=RFILE FILE...

常用的几个参数为:

  • --reference=RFILE : 参考指定文件进行所属组更换

  • -R, --recursive :递归处理,将某个目录的所有文件均更改用户组

默认用法

最简单的使用为将文件file归属到组group,使用方法为:

$ chgrp group file
$ chgrp group1 file1

此时的file数组组group,file1属于组group1。

更改文件夹的所属组

对于文件夹而言,就需要使用-R参数来递归实现了,不然会报错的。

$ chgrp -R group1 directory1
$ chgrp -R group2 directory2

根据指定文件来修改组

这个参数比较有趣,也比较高效,如果希望某个用户的组权限与另外一个文件一致,此时--reference强势出现

$ chgrp --reference=ref_file stage_file

该命令执行后,stage_file的权限将与ref_file的组权限一样。

TODO

设置SGID属性(确保NEWGROUP组拥有所有新建的文件),设置sticky(沾滞位)属性(以免文件被拥有者以外的其他人删除)

chmod g+s,o+t /home/groupdir

具体参考SGID/SUID/SBID以及sticky的详细含义。

文件权限设置命令 chmod

文件权限指的是文件是否可以执行、写入、读取等操作。

而Linux/Unix的文件存取权限分为三级 : 文件所有者、用户组及其他,分别使用以下字母来表示:

  • u:所有者
  • g:用户组
  • o:其他用户

如下图所示,每个级别都可以设置为rwx三种权限 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该命令官方定义为:

chmod - change mode

所以可以通过chmod来控制文件如何被他人所存取。

使用的语法如下所示:

$ chmod [-cfvR] [--help] [--version] mode file...

其中mode权限设定的格式如下 : [ugoa] [±=] [rwxX]

其中u表示该文件的拥有者,g表示与该文件的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是。

  • + 表示加权限、 表示减权限、= 表示设定唯一权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)

对于chmod的使用而言,只有文件所有者和超级用户可以修改文件或目录的权限。

具体的方法为可以使用符号模式或者绝对模式来进行操作。

而我比较喜欢用的是绝对数字模式,比较粗暴简单。

符号模式

使用符号模式需要考虑多个因素,其中包括用户类型,操作符 和设定权限。

who用户类型说明
uuser文件所有者
ggroup文件所有者所在组
oothers所有其他用户
aall所用用户, 相当于 ugo

operator 的符号模式表:

Operator说明
+为指定的用户类型增加权限
-去除指定用户类型的权限
=设置指定用户权限的设置,即将用户类型的所有权限重新设置

permission 的符号模式表:

模式名字说明
r设置为可读权限
w设置为可写权限
x执行权限设置为可执行权限

绝对数字模式

chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者的读、写、执行权限,用户组的读、写、执行以及其它用户的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。比如下面的0-7分别表示各自的权限定义。

No权限rwx二进制
7读 + 写 + 执行rwx111
6读 + 写rw-110
5读 + 执行r-x101
4只读r–100
3写 + 执行-wx011
2只写-w-010
1只执行–x001
0000

如表所示:

  • 对于7而言就表示所有者的权限为可读、可写、可执行,也就是对应的八进制为111,所以就是7;
  • 而对于 5而言,表示所有者的权限为可读、可执行,对应的八进制为101,所以就是5;

其他类似。

实例更改为全部可读

接下来将文件 a.c 设为所有人皆可读取 ,有三种方式可以使用,如下,分别为 :

  1. chmod ugo+r filename
  2. chmod a+r filename
  3. chmod 444 filename

具体如下所示:

通过方法1:

# 默认设定为没有任何属性
$ ll

# 更改为全部可读
$ chmod ugo+r file1.txt

$ ll
-r--r--r--  1 user  user     5KB  Feb  12 22:22 a.c

通过方法2:

# 默认设定为没有任何属性
$ ll

# 更改为全部可读
$ chmod a+r file1.txt

$ ll
-r--r--r--  1 user  user     5KB  Feb  12 22:23 a.c

通过方法3:

# 默认设定为没有任何属性
$ ll

# 更改为全部可读
$ chmod 444 file1.txt

$ ll
-r--r--r--  1 user  user     5KB  Feb  12 22:24 a.c

设置用户及组可读写,其他用户无法写入但可以查看

接下来继续把文件 a.c设置为用户 和组可以读写,而其他 用户无法写入但是 可以查看 。

使用符号模式如下:

$ ll
-r--r--r--  1 user  user     5KB  Feb  12 22:24 a.c

$ chmod ug+rw,o+r,o-w a.c

$ ll
-rw-rw-r--  1 user  user     5KB  Feb  12 22:26 a.c

使用数字模式如下:

$ ll
-r--r--r--  1 user  user     5KB  Feb  12 22:24 b.c

$ chmod 664 a.c

$ ll
-rw-rw-r--  1 user  user     5KB  Feb  12 22:26 b.c

设定为所有人只有可执行权限

此时不管文件的权限是什么,因为只具有可执行权限,所以符号模式可以使用**=**,而数字模式只需要1即可,如下:

$ chmod a=x filename
#或者
$ chmod 111 filename

# 无法读取
$ cat a.c 
cat: a.c: Permission denied

所以对于只有可执行权限的文件,是无法执行读取或者写入操作的,这也保证了文件的安全性。

炫技 - TODO

其实对于每个文件或者目录而言,除了rwx权限,还有 一个权限位,这个权限为一般为特殊权限。

模式名字说明
X特殊执行权限只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
ssetuid/gid当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
t粘贴位设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

若用 chmod 4755 filename 可使此程序具有 root 的权限。

更多说明

命令说明
chmod 4755 *file*4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。
find path/ -type d -exec chmod a-x {} \;删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件
find path/ -type d -exec chmod a+x {} \;允许所有用户浏览或通过目录path/

Linux chown 命令

Linux chown 命令用于设置文件所有者和文件关联组的命令。

官方的定义为:

chown - change file owner and group

Linux/Unix 的有个理念就是一切皆文件,而对于每个文件也是如chmod所述,均拥有所有者。

此时就可以利用 chown 指定文件的拥有者或者指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符

不过需要注意的是 chown 需要超级用户 root 的权限才能执行此命令,或者使用sudo也可以。

使用语法

使用语法如下:

$ chown [option] [user[:group]] file...
# 或者
$ chown [option] --reference=RFILE file...

其中user为新的文件拥有者的用户名或者IDgroup为新的文件拥有者的用户组名或ID****。

并且可以通过--referenc=RFILE选项来设定希望修改的文件和目录。

其他的选项可以为: :

  • -c : 与-v类似,不过只显示更改的信息
  • -R : 递归地处理指定的目录以及其子目录下的所有文件

通用实例

最简单的使用方式应该就是指定用户和用户组了,如下:

$ ll 
-rw-rw-r--. 1 user user 5 May   7 14:56 a

$ sudo chown user1:group1 a

$ ll 
-rw-rw-r--. 1 user1 group1 5 May   7 14:56 a

上面的命令将把a指定为用户user1,组group1。注意user1group1必须存在,不然会提示无效的用户或者组。

更新组而不更新用户

这个选项一般用在,希望把某个用户的文件共享到一个组,此时的方法如下:

$ sudo chown :newgroup filename

此时的用户所有者不变,而仅仅更改了文件所属组。

提示更新

$ sudo chown -c user1 a b c d
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

$ sudo chown -v user1 a b c d
changed ownership of "a" from user to user1
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

从这个例子可以看出,对于-c和-v的区别,-v全部显示,而-c仅仅显示更新的部分。

递归处理文件或文件夹

$ sudo chown -R user:group file directory

此条命令将递归地将文件file和目录directory及其子目录的文件更新为user用户拥有,group组拥有。—

Linux 的cp命令

cp命令很简单,字面的意思,copy的缩写,意指拷贝数据。

官方含义为:

cp - copy files and directories

– 拷贝文件和文件夹。

命令格式

简单的格式如下所示,cp后面跟上选项,然后是SRC,最后是DEST

$ cp [option]... SOURCE... DIRECTORY

下面说几个最常用的选项实例。

  • -a:保留链接、文件属性,并复制目录下的所有内容,类似于等于dpr参数组合
  • -d:复制时保留链接
  • -f:覆盖已经存在的目标文件而不给出提示
  • -i:与-f选项相反,要求用户确认是否覆盖
  • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件
  • -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件

首先假设有两个文件夹dir1dir2,里面的内容如下所示:

dir1
├── a
├── b
├── c
└── d
dir2
├── b
├── d
└── e

0 directories, 7 files

详细信息如下所示:

$ ll *
dir1:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:23 a
-rw-rw-r-- 1 user user 0 Jul 20 21:23 b
-rw-rw-r-- 1 user user 0 Jul 20 21:23 c
-rw-rw-r-- 1 user user 0 Jul 20 21:23 d

dir2:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:25 b
-rw-rw-r-- 1 user user 0 Jul 20 21:25 d
-rw-rw-r-- 1 user user 0 Jul 20 21:25 e

cp最常用的选项如下所示:

  • i : 覆盖一个已经存在的文件前,提示用户进行确认
  • r:递归地复制目录及其内容,复制目录的时候必须使用这个参数
  • u:只复制不存在或者更新的文件
  • v:复制文件时,显示复制信息

组合rv - 可以拷贝文件或文件夹

这个在显示复制信息的时候,也可以复制目录

$ cp -rv dir1/* dir2/
‘dir1/a’ -> ‘dir2/a’
‘dir1/b’ -> ‘dir2/b’
‘dir1/c’ -> ‘dir2/c’
‘dir1/d’ -> ‘dir2/d’

拷贝时提示确认

这个参数在使用rm的时候已经记得使用,不然就像rm -rf /一样,一个公司没有了。

$ cp -i dir1/* dir2/
cp: overwrite ‘dir2/a’? y
cp: overwrite ‘dir2/b’? y
cp: overwrite ‘dir2/c’? y

这个选项在文件超级多时候,慎用!!

只拷贝不存在或更新的文件

u表示update,也就是从一个目录拷贝到另外一个目录时,只会复制那些不存在或者目标目录相应文件的更新文件。

执行下面的命令:

$ cp -u dir1/* dir2/

可以得到:

$ ll *
dir1:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:23 a
-rw-rw-r-- 1 user user 0 Jul 20 21:23 b
-rw-rw-r-- 1 user user 0 Jul 20 21:23 c
-rw-rw-r-- 1 user user 0 Jul 20 21:23 d

dir2:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:29 a
-rw-rw-r-- 1 user user 0 Jul 20 21:25 b
-rw-rw-r-- 1 user user 0 Jul 20 21:29 c
-rw-rw-r-- 1 user user 0 Jul 20 21:25 d
-rw-rw-r-- 1 user user 0 Jul 20 21:25 e

如何用cp拷贝指定序号的文件

现在有文件夹filename,内有文档,名字是从1.txt, 2.txt, 3.txt 一直到9999.txt,10000.txt,现在希望从第N组数据即N.txt到第M组数据M.txt的文件拷贝到别的文件夹中,方法如下:

$ cp {N..M}.txt   newfilename/

这个方法可是相当的赞呀(≧▽≦)/,基本可以秒掉大多数的GUI程序了。—

Linux curl命令

Linux curl命令是一款用于从一个server端传输的工具。

很强力,支持众多协议,比如:DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP,
SMTPS, TELNET 和 TFTP).

这个命令设计之初也是希望不需要用户的交互和介入。

官方定义为:

curl - transfer a URL

语法

$ curl [options / URLs]

参数

  • -O : 把输出写到该文件中,保留远程文件的文件名
  • -u : 通过服务端配置的用户名和密码授权访问

默认比较两个文件

默认情况下,将下载的数据写入到文件,并且使用服务器上的名字,这里以下载Linux的内核代码为例。

$ curl https://mirrors.edge.kernel.org/pub/linux/kernel/v2.4/linux-2.4.32.tar.gz -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  1 36.7M    1  575k    0     0  17431      0  0:36:50  0:00:33  0:36:17 27222

需要授权的网站

部分网站可能需要访问的授权,此时可以使用-u选项提供用户名和密码进行授权:

$ curl -u username https://www.website.com/
 Enter host password for user 'username':

批量下载

当然,这么强力的工具,肯定是支持批量下载的,并且是正则表达式的支持。

比如:🔗ftp://ftp.example.com/的file1,file5和file7,方法如下:

$ curl ftp://ftp.example.com/file{1,5,7}.txt

如果下载🔗ftp://ftp.example.com/的从file1到file100的100组文件,方法如下:

$ curl ftp://ftp.example.com/file[1-100].txt

一日难再晨及时当勉励 date

一日难再晨及时当勉励 date

Linux 的 dd 命令

dd这个命令一直没有弄明白缩写的含义,这个命令应该归到Linux炫技里面,因为我也是很晚才用到,不过有些功能还可以尝试一下。

官方含义为:

dd - convert and copy a file

从官方含义来看,是不是定义为cc比较合适,_

dd命令用于复制文件,转换或者格式化文件。

dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。

命令格式

命令比较简单:

$ dd 选项

对于刚开始而言,仅仅下面几个掌握下面几个参数就完全够用了。

  • of=FILE, 将输出定位到FILE,而不是默认的stdout
  • bs=BYTES,每次读取的字节数,默认为512字节
  • count=N, 拷贝N个输入块
  • if=FILE, 从FILE输入,而不是默认的stdin

考虑替换cp命令

既然命令第一个说明就是拷贝文件,那么正常情况下基本是可以替换cp的,不过前提是有参数指定,比如:


# 默认cp拷贝,一个1GB的文件,花费1.05秒
$ time cp a b
cp a b  0.02s user 1.05s system 75% cpu 1.403 total

# 默认dd拷贝,一个1GB的文件,竟然花费了29.17秒
$ time dd if=a of=b
2048000+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 34.7214 s, 30.2 MB/s
dd if=a of=b  1.31s user 29.17s system 87% cpu 34.996 total

为什么dd这么慢,很简单,在不指定bs的情况下,默认为512字节,dd就会根据512来切分,时间都浪费在了这个上面。

所以简单地加上这个参数,迅速提升效率

$ time dd if=a of=b bs=2M
500+0 records in
500+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 1.04747 s, 1.0 GB/s
dd if=a of=b bs=2M  0.00s user 1.05s system 78% cpu 1.332 total
$ time dd if=a of=b bs=4M
250+0 records in
250+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 1.00866 s, 1.0 GB/s
dd if=a of=b bs=4M  0.00s user 1.00s system 76% cpu 1.304 total
$ time dd if=a of=b bs=8M
125+0 records in
125+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.937974 s, 1.1 GB/s
dd if=a of=b bs=8M  0.00s user 0.92s system 79% cpu 1.164 total
$ time dd if=a of=b bs=10M
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 1.01666 s, 1.0 GB/s
dd if=a of=b bs=10M  0.00s user 1.03s system 82% cpu 1.257 total

测试硬盘速度

我最常使用的dd命令的用例是,测试硬盘的读写速度,比如很简单地写入1GB、10GB来看一下。

$ dd if=/dev/zero of=tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.7338 s, 1.4 GB/s

$ dd if=/dev/zero of=tmp bs=2M count=500
500+0 records in
500+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.611315 s, 1.7 GB/s

$ dd if=/dev/zero of=tmp bs=4M count=250
250+0 records in
250+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.602517 s, 1.7 GB/s

然后根据这些参数,可以简单写一个脚本来评估系统的整体读写速率了。

当然dd系统管理员用的最多的应该是系统备份和克隆了,暂且不表。

df - 查看硬盘大小

使用man来查看df,官方含义为:

report file system disk space usage

也就是查看文件系统的磁盘空间占用情况,可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

选项

这个命令的使用也是中规中矩,df [options],其中一些比较有用的选项为:

  • -a, --all,这个用的不多,不过可以把所有的信息,包括无法访问的一一列出来
  • -B, --block-size=SIZE,以SIZE为单位显示,比如M/T分别按照MBTB来显示
  • --total:比较好用的是,提供了一个总的使用比例出来
  • -h, --human-readable:这个比较友好,也是最常用的一个选项
  • -H, --si:强迫症必备,如果非要认为1K是1000而不是1024.
  • -l, --local:对于目前网络挂载NFS等等必须的一个选项
  • -T, --print-type:打印文件系统的类型,比如xfs,比如zfs等等

不加任何参数的输出

如果不加任何选项,输出如下:

$ df
Filesystem            1K-blocks        Used   Available Use% Mounted on
/dev/mapper/cl-root   976083292   242281612   733801680  25% /
devtmpfs               16315508           0    16315508   0% /dev
tmpfs                  16332416       18788    16313628   1% /dev/shm
tmpfs                  16332416     1643588    14688828  11% /run
tmpfs                  16332416           0    16332416   0% /sys/fs/cgroup
/dev/sdb2               1038336      407812      630524  40% /boot
/dev/sda            93759481856 72887620044 20871861812  78% /data
/dev/mapper/cl-home 32210167688 29543283400  2666884288  92% /home
tmpfs                   3266484         236     3266248   1% /run/user/1000

其实我比较想知道data目录到底是多大,哈哈

全而杂的-a选项

这个选项虽然可以输出所有的信息,但是有些真的不是一般人需要并且想要的。

$ df -a
Filesystem            1K-blocks        Used   Available Use% Mounted on
rootfs                        -           -           -    - /
sysfs                         0           0           0    - /sys
proc                          0           0           0    - /proc
devtmpfs               16315508           0    16315508   0% /dev
securityfs                    0           0           0    - /sys/kernel/security
tmpfs                  16332416       18788    16313628   1% /dev/shm
devpts                        0           0           0    - /dev/pts
tmpfs                  16332416     1643588    14688828  11% /run
tmpfs                  16332416           0    16332416   0% /sys/fs/cgroup
cgroup                        0           0           0    - /sys/fs/cgroup/systemd
pstore                        0           0           0    - /sys/fs/pstore
cgroup                        0           0           0    - /sys/fs/cgroup/memory
cgroup                        0           0           0    - /sys/fs/cgroup/pids
cgroup                        0           0           0    - /sys/fs/cgroup/freezer
cgroup                        0           0           0    - /sys/fs/cgroup/perf_event
cgroup                        0           0           0    - /sys/fs/cgroup/net_cls,net_prio
cgroup                        0           0           0    - /sys/fs/cgroup/blkio
cgroup                        0           0           0    - /sys/fs/cgroup/cpuset
cgroup                        0           0           0    - /sys/fs/cgroup/cpu,cpuacct
cgroup                        0           0           0    - /sys/fs/cgroup/devices
cgroup                        0           0           0    - /sys/fs/cgroup/hugetlb
configfs                      0           0           0    - /sys/kernel/config
/dev/mapper/cl-root   976083292   242283596   733799696  25% /
selinuxfs                     0           0           0    - /sys/fs/selinux
systemd-1                     -           -           -    - /proc/sys/fs/binfmt_misc
debugfs                       0           0           0    - /sys/kernel/debug
mqueue                        0           0           0    - /dev/mqueue
hugetlbfs                     0           0           0    - /dev/hugepages
/dev/sdb2               1038336      407812      630524  40% /boot
/dev/sda            93759481856 72887620044 20871861812  78% /data
/dev/mapper/cl-home 32210167688 29543283400  2666884288  92% /home
sunrpc                        0           0           0    - /var/lib/nfs/rpc_pipefs
tmpfs                   3266484         236     3266248   1% /run/user/1000
gvfsd-fuse                    0           0           0    - /run/user/1000/gvfs
fusectl                       0           0           0    - /sys/fs/fuse/connections
binfmt_misc                   0           0           0    - /proc/sys/fs/binfmt_misc

根据TB来显示

如果知道硬盘的空间或存储在TB量级就可以用BT了,如果是PB量级的,恭喜你,可以用BP.

$ df -BT
Filesystem          1T-blocks  Used Available Use% Mounted on
/dev/mapper/cl-root        1T    1T        1T  25% /
devtmpfs                   1T    0T        1T   0% /dev
tmpfs                      1T    1T        1T   1% /dev/shm
tmpfs                      1T    1T        1T  11% /run
tmpfs                      1T    0T        1T   0% /sys/fs/cgroup
/dev/sdb2                  1T    1T        1T  40% /boot
/dev/sda                  88T   68T       20T  78% /data
/dev/mapper/cl-home       30T   28T        3T  92% /home
tmpfs                      1T    1T        1T   1% /run/user/1000

我想知道整个系统一共用了多少

此时total发挥出绝佳的作用,在最后一行输出一个总占比

$ df --total
Filesystem             1K-blocks         Used   Available Use% Mounted on
/dev/mapper/cl-root    976083292    242283596   733799696  25% /
devtmpfs                16315508            0    16315508   0% /dev
tmpfs                   16332416        18788    16313628   1% /dev/shm
tmpfs                   16332416      1643588    14688828  11% /run
tmpfs                   16332416            0    16332416   0% /sys/fs/cgroup
/dev/sdb2                1038336       407812      630524  40% /boot
/dev/sda             93759481856  72887620044 20871861812  78% /data
/dev/mapper/cl-home  32210167688  29543283400  2666884288  92% /home
tmpfs                    3266484          236     3266248   1% /run/user/1000

我在单独拉出来秀一秀 :total 127015350412 102675257464 24340092948 81% -

非目力所及,自动判断

这个是我用的很多的参数,应该也是最常用的,-h的含义前面也可以看到是human-read的意思,方便我们人类,会使用M、G这样的单位来区别

$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root  931G  232G  700G  25% /
devtmpfs              16G     0   16G   0% /dev
tmpfs                 16G   19M   16G   1% /dev/shm
tmpfs                 16G  1.6G   15G  11% /run
tmpfs                 16G     0   16G   0% /sys/fs/cgroup
/dev/sdb2           1014M  399M  616M  40% /boot
/dev/sda              88T   68T   20T  78% /data
/dev/mapper/cl-home   30T   28T  2.5T  92% /home
tmpfs                3.2G  236K  3.2G   1% /run/user/1000

强迫症患者的福音

如果非得说1K是1000,而不是1024,那么这个选项比较合适秀一下。

$ df -H
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root  1.0T  249G  752G  25% /
devtmpfs              17G     0   17G   0% /dev
tmpfs                 17G   20M   17G   1% /dev/shm
tmpfs                 17G  1.7G   16G  11% /run
tmpfs                 17G     0   17G   0% /sys/fs/cgroup
/dev/sdb2            1.1G  418M  646M  40% /boot
/dev/sda              97T   75T   22T  78% /data
/dev/mapper/cl-home   33T   31T  2.8T  92% /home
tmpfs                3.4G  242k  3.4G   1% /run/user/1000

只显示本地信息

在网络发达的今天,各种挂载满天飞,NFS四处连接,如果不跟上l选项,估计已经分不清哪个是哪个了。

$ df -l
Filesystem            1K-blocks        Used   Available Use% Mounted on
/dev/mapper/cl-root   976083292   242283596   733799696  25% /
devtmpfs               16315508           0    16315508   0% /dev
tmpfs                  16332416       18788    16313628   1% /dev/shm
tmpfs                  16332416     1643588    14688828  11% /run
tmpfs                  16332416           0    16332416   0% /sys/fs/cgroup
/dev/sdb2               1038336      407812      630524  40% /boot
/dev/sda            93759481856 72887620044 20871861812  78% /data
/dev/mapper/cl-home 32210167688 29543283400  2666884288  92% /home
tmpfs                   3266484         236     3266248   1% /run/user/1000

查看系统类型

系统类型有很多,可以通过-T选项来查找。

$ df -T
Filesystem          Type       1K-blocks        Used   Available Use% Mounted on
/dev/mapper/cl-root xfs        976083292   242283596   733799696  25% /
devtmpfs            devtmpfs    16315508           0    16315508   0% /dev
tmpfs               tmpfs       16332416       18788    16313628   1% /dev/shm
tmpfs               tmpfs       16332416     1643588    14688828  11% /run
tmpfs               tmpfs       16332416           0    16332416   0% /sys/fs/cgroup
/dev/sdb2           xfs          1038336      407812      630524  40% /boot
/dev/sda            xfs      93759481856 72887620044 20871861812  78% /data
/dev/mapper/cl-home xfs      32210167688 29543283400  2666884288  92% /home
tmpfs               tmpfs        3266484         236     3266248   1% /run/user/1000

且看迥然不同的 diff

… note::
草色烟光残照里,无言谁会凭阑意
宋代 柳永《蝶恋花·伫倚危楼风细细》

Linux diff 命令用于比较文件的差异。

当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机即用的。

官方定义为:

GNU diff - compare files line by line

diff 会以逐行的方式,比较文本文件的不同。

如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

语法

$ diff [OPTION]... FILES

参数

  • -c 显示所有内容,并标出不同之处。
  • -u 以合并的方式来显示文件内容的不同。
  • -y--side-by-side  两列输出显示文件的异同之处。

假定有两个文件ab,内容分别为:

$ cat a
This is a.
Hello a.
Hello World.

$ cat b
This is b.
Hello b.
Hello World.

默认比较两个文件

默认情况下,直接输入下面命令即可:

$  diff a b
1,2c1,2
< This is a.
< Hello a.
> This is b.
> Hello b.
3a4
> One more line.

可以看到1,2c1,2,中间有一个字母c3a4,中间有一个字母a

那么ac什么含义呢,中间的字母表示需要在第一个文件上做的操作(a=add,c=change,d=delete),然后才有后面的文件一致。

所以1,2c1,2表示1,2行更换后一致;3a4表示,增加一行后一致。

并排显示方便比较

这种方式相对而言,就很亲民了,左右两边两列方便比对。

$ diff a b -y
This is a.                                                    | This is b.
Hello a.                                                      | Hello b.
Hello World.                                                    Hello World.
                                                              > One more line.

那么:

  • "|"表示前后2个文件内容有不同;

  • "<"表示后面文件比前面文件少了1行内容

  • ">"表示后面文件比前面文件多了1行内容

context模式比较

这种模式会输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下*** 表示a的内容,--- 表示b的内容。

$ diff a b -c
*** a   2013-03-04 23:20:20.322345200 +0800
***************
*** 1,3 ****
! This is a.
! Hello a.
  Hello World.
! This is b.
! Hello b.
  Hello World.
+ One more line.

unified模式比较

这种模式会混合输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下--- 表示a的内容,+++ 表示b的内容。

$  diff a b -u
@@ -1,3 +1,4 @@
-This is a.
-Hello a.
+This is b.
+Hello b.
 Hello World.
+One more line.

对比时忽略空格

# diff -w name_list.txt name_list_new.txt

2c2,3
< John Doe --- > John M Doe
> Jason Bourne

du - 估计文件空间的使用

使用man来查看du,我们知道这个命令的含义为estimate file space usage

也就是查看文件系统的磁盘空间占用情况,可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

选项

命令的使用方法为:

$ du [options]... [FILE]...

其中一些比较有用的命令选项为:

  • -0, --null : 这个只是对输出有效果,把所有的输出放在一行

  • -a, --all:这个选项会统计所有的信息,而不只是文件夹

  • -B, --block-size=SIZE:类似于df命令

  • -c, --total:最后一行,显示一个统计信息

  • -d, --max-depth=N:指定统计目录的层级,只有在层级大于N时有效

  • -h, --human-readable:同df命令,自动优化显示

  • -l, --count-links:如果是硬链接,则计入大小

  • -s, --summarize:显示统计信息

最常用组合

$ du -sh
4.0G	.

显示当前文件夹的总大小

默认输出

$ du 
2048000	./original
4096000	.

不换行输出

$ du -0
2048000	./original4096000	.

统计所有信息

$ du -a
204800	./xaa
204800	./xab
204800	./xac
204800	./xad
204800	./xae
204800	./xaf
204800	./xag
204800	./xah
204800	./xai
204800	./xaj
2048000	./original/dat1
2048000	./original
0	./tsta
4096000	.

指定显示容量单位

$ du -BG
2G	./original
4G	.

显示总容量

$ du -c
2048000	./original
4096000	.
4096000	总用量

自动显示大小单位

$ du -h
2.0G	./original
4.0G	.

汇总显示

$ du -s
4096000	.

有时间展示的信息

组合上面的几个参数,显示汇总信息,以及时间信息等等。

$ du -a --time --time-style=full-iso
200M  2014-06-21 22:18:45.551076154 +0800	./xaa
200M	2014-06-21 22:18:45.752074291 +0800	./xab
200M	2014-06-21 22:18:45.951072446 +0800	./xac
200M	2014-06-21 22:18:46.149070610 +0800	./xad
200M	2014-06-21 22:18:46.348068766 +0800	./xae
200M	2014-06-21 22:18:46.563066772 +0800	./xaf
200M	2014-06-21 22:18:46.762064928 +0800	./xag
200M	2014-06-21 22:18:46.961063083 +0800	./xah
200M	2014-06-21 22:18:47.167061173 +0800	./xai
200M	2014-06-21 22:18:47.366059329 +0800	./xaj
2.0G	2014-06-21 22:17:48.740602788 +0800	./original/dat1
2.0G	2014-06-21 22:19:01.134931691 +0800	./original
0	2014-06-21 22:17:46.501499784 +0800	./tsta
4.0G	2014-06-21 22:15:57:46.501499784 +0800	.

Linux 的 echo 命令

echo命令用于在终端设备上输出字符串或变量的值,类似于PythonprintC语言的printf,是Linux系统中最常用的命令之一。

其中输出字符串主要在shell脚本中使用,常用的还是输出变量的值。

命令格式为:echo [参数] [字符串]

其中常用的参数为:

  • -n 不输出结尾的换行符
  • -e "\a"发出警告音
  • -e "\n"换行,光标移至行首
  • -e "\r"光标移至行首,但不换行、主用用在打印循环的情况下

几个示例

输出一段字符串:

$  echo "Hello Linux" 
Hello Linux

输出变量提取后的值:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

一般使用在变量前加上 符号的方式提取出变量的值,例如: 符号的方式提取出变量的值,例如: 符号的方式提取出变量的值,例如:PATH,然后再用echo命令予以输出。或者直接使用echo命令输出一段字符串到屏幕上,起到给用户提示的作用。

其中的PATH与Windows的环境变量类似

几个Linux命令来输出:

$ echo `date`
Sat 12 Feb 2011 22:19:03 PM CST

查询上一次的执行结果

$echo $?

$?是Shell中的一个特殊变量,表示上一条命令的退出状态,0表示成功。—

env 在一个修改的环境中运行程序

env其实就是environment的缩写,用来查看或者修改当前的环境。

Linux是多用户的平台,为了每个用户都有自己的设置,env使用了比较多的环境变量,比如echo $HOME后不同的用户可以看到不同的路径。

官方定义为:

修改则可以用env命令进行管理。

官方定义为:

env - run a program in a modified environment

语法

语法如下所示:

$ env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

常用的参数为:

  • -i 开始一个新的空的环境

  • -u 取消设置的的变量

  • -C 更改工作目录

  • -S 分割输入参数

默认无参数

默认情况下,输入env会给出当前设置的环境和系统默认的环境。

$ env
HOSTTYPE=x86_64
LANG=en_US.utf8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:
NAME=LOCALHOST
HOME=/home/username
USER=username
LOGNAME=username
SHELL=/usr/bin/bash
SHLVL=1
PWD=/home/username/mycode/c
OLDPWD=/home/username/mycode/python
PAGER=less
LESS=-R
...

设置环境变量

当然env最重要的还是设置环境变量,一般使用为:

$ env NAME=what-you-want-to-set

接下来使用echo $NAME就可以看到效果了。

全新的环境

如果希望运行程序的过程中,不受到原来环境的影响,可以使用-i参数,直接开启一个全新的环境。

$ env -i program

取消某些环境变量

通过-u来取消某些设置的环境变量,比如:

$ env -u PWD
HOSTTYPE=x86_64
LANG=en_US.utf8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:
NAME=LOCALHOST
HOME=/home/username
USER=username
LOGNAME=username
SHELL=/usr/bin/bash
SHLVL=1
OLDPWD=/home/username/mycode/python
PAGER=less
LESS=-R
...

可以看到与env相比,PWD变量已经不存在了。

更改工作路径

可以通过-C来更改工作的路径。

$ pwd
/home/username/linux/scripts
$ env -C .. pwd
/home/username/linux

进阶的传递多个参数

这个参数较多用在脚本中,-S后面可以跟多个参数,如果没有这个参数,则只能跟一个参数,比如以脚本为例:

#!/usr/bin/env perl -w -T

会报错

/usr/bin/env: 'perl -w -T': No such file or directory

此时加上-S就可以解决了,如下:

#!/usr/bin/env -S perl -w -T

显示管理磁盘分区 fdisk

… note::

浮云一别后,流水十年间。

fdisk是用于检查一个磁盘上分区信息最通用的命令。

fdisk可以显示分区信息及一些细节信息,比如文件系统类型等。

设备的名称通常是/dev/sda、/dev/sdb 等。

对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设备逐步淘汰了。

fdisk也可以用于创建并操控分区表信息,支持主任GPU、MBR、Sun、SGI和BSD。

块设备可以划分为一个或多个称为分区的逻辑磁盘。这种划分的记录会保存在分区表,通常位于磁盘的第 0 扇区。

fdisk的官方解释为:

fdisk - manipulate disk partition table

语法格式为:

$ fdisk [options] device

$ fdisk -l [device...]

其中一些常用的参数为:

  • -l 列出指定的外围设备的分区表状况
  • -L, --color[=when] :将输出颜色化,其中when可以指定为auto, never or always. 默认为 auto.

显示当前系统的分区情况

这个也是我唯一推荐入门者使用的 命令,仅仅list显示出目前的系统分区。

万万不要输入fdisk执行其他操作,极易格式化硬盘,切记切记。

$ fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 256.1 GB, 256060514304 bytes, 500118192 sectors # 磁盘空间及扇区信息
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: FAF37680-0ECE-4BE7-93FC-E87A8F2F6455

识别文件类型的file

file鉴别大神

file的官方解释为:

file - determine file type

也就是说可以识别文件类型的意思,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的,所以加不加后缀真的无所谓,谁会爱上谁,说起Windows吗,啥也不说了。

下面看几个比较使用的例子。

实例一 :默认

file后直接跟文件,得到如下所示信息

$ file book.pdf
delete.pdf: PDF document, version 1.3file book
delete: PDF document, version 1.3

可以看出加不加后缀都是没有关系的。

实例二:不显示名称

$ file -b book.pdf
PDF document, version 1.3

加上-b参数,是brief的含义,将只显示文件辨识结果,不显示文件名称了,这个其实对于很多文件而言,不是很友好。

实例三:输出易懂信息

$ file -i  delete.pdf
delete.pdf: application/pdf; charset=binary

加上-i参数,是mime类型的含义,我也不懂是啥意思,但是我能刚方便地读懂我想知道的文件类型的含义。这就够了,不是吗,毕竟我们是来是用file命令的。

实例四:查看文件中的文件名的文件信息

$ cat hello.txt
sunset.jpg
$ file -f hello.txt
sunset.jpg: JPEG image data, JFIF standard 1.01

这个咋听着这么拗口,其实很简单,其实并不难,加上·-f·参数,是file-from类型的含义,到底是几个意思呢,也就是你想查看文件的类型信息的文件名在一个文件里面,从这个文件里面读取文件的信息。

实例五:好看的鸡肋

$ file -F " === " sunset.jpg
sunset.jpg ===  JPEG image data, JFIF standard 1.01

这个功能说实话,没搞明白有什么作用,默认的:感觉挺好用的,当然这个应该属于定制型的,就是默认替换掉一些提示信息。

实例六:查看软链接的文件信息

$ file a.jpg
a.jpg: symbolic link to `sunset.jpg'
$ file -L a.jpg
a.jpg: JPEG image data, JFIF standard 1.01

默认情况下,如果没有-L参数,只能得到这个文件是软链接的信息,如果加上这个参数,就能看到源文件的文件信息,这个功能还是很赞的。

一切皆可查的 find

find命令用来在指定目录下查找文件,功能相当之强大。

官方定义为:

find - search for files in a directory hierarchy

Linux的哲学是一切皆文件,那么find的使命就是一切皆可查

语法

使用语法为:

$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

比较常用的几个参数为:

  • -exec <执行指令>:假设find指令的回传值为True,就执行该指令;
  • -size <文件大小>:查找符合指定的文件大小的文件;
  • -mtime <24小时>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
  • -type <文件类型>:只寻找符合指定的文件类型的文件;

无参数

如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

$ ls -l
total 310M
-rw-rw-r-- 1 user user  10M Mar 21 20:01 a
drwxrwxr-x 2 user user   22 Mar 21 20:01 aa
-rw-rw-r-- 1 user user 100M Mar 21 20:01 b
-rw-rw-r-- 1 user user 200M Mar 21 20:01 c


$ find 
.
./a
./b
./c
./test

查找小于,等于和大于100MB的文件

通过-size大小来查找文件

$ find . -size -100M
.
./a
./aa
$ find . -size 100M
./b
$ find . -size +100M
./c
./aa/d

查找多长时间修改过

可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。

$ find . -mtime +60

# 最近2天以内未修改
$ find . –mtime -2

稍微复杂但是很有用的命令

我经常把 find 命令和他的选项 exec一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:

$ find /path/ -type f -exec chmod 644 {} \;

这个命令会递归搜索指定目录内/path/下的所有文件,并对找到的文件执行 chmod 命令。—

Linux 查看系统内存

**free**这个命令在Linux系统监控的工具里面,算是使用的比较多的一个。

使用_man_查看可知,官方含义为:

Display amount of free and used memory in the system

也就是显示可用、易用的系统内存,它直接读取/proc/meminfo文件。

默认的效果

先看下不加任何参数的时候,free的效果:

$ free
              total        used        free      shared  buff/cache   available
Mem:       32664832    15667736      674136      464892    16322960    15803156
Swap:      16449532     3039756    13409776

看起来很多的样子,但是不直观,我比较喜欢加上-h参数。

使用易读的参数

-h参数,跟前面的df等命令类似,此处的h表示_human being_的含义方便人类阅读。 除了这个还有_-b,-k,-m,-g_,含义分别为按照_字节、KB、MB、GB_的格式来显示。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:            31G         14G        655M        453M         15G         15G
Swap:           15G        2.9G         12G

Wow,此时的显示简直好简洁。

说下其中的含义:

  • total : 表示总的物理内存大小,比如上面的就表示31GB的内存

  • used :表示已经使用的内存大小,比如上面的就是使用了14GB

  • free :表示可用多少

  • shared:表示多个进程共享的内存大小

  • buff/cache:表示磁盘缓存的大小,这里有两个方面,buffcache,两个的含义不同

  • available:当然含义为可用的内存容量大小

间隔显示内存状态

还有一个比较常用的就是,如果你希望过一段时间就看下free的情况,OK,使用参数-s,后面跟的单位是秒,也就是每个几秒,统计一下使用的内存情况,比如我们每个2s,显示一下

$ free -s 2
              total        used        free      shared  buff/cache   available
Mem:       32664832    15668528      670964      464892    16325340    15802360
Swap:      16449532     3039756    13409776

              total        used        free      shared  buff/cache   available
Mem:       32664832    15669760      669724      464892    16325348    15801124
Swap:      16449532     3039756    13409776

              total        used        free      shared  buff/cache   available
Mem:       32664832    15670220      669248      464892    16325364    15800652
Swap:      16449532     3039756    13409776

              total        used        free      shared  buff/cache   available
Mem:       32664832    15669264      670204      464892    16325364    15801624
Swap:      16449532     3039756    13409776

查看meminfo文件

$ cat /proc/meminfo

其实free读取的就是这个文件的某些信息,可以通过同步监控这个文件来check free的状态。

文件内容搜索利器 - grep

Linux grep 命令用于查找文件里符合条件的字符串。

官方定义为:

grep, egrep, fgrep - print lines matching a pattern

grep支持正则表达式,是一个强大的文本搜索工具。

语法

语法也挺复杂,因为功能确实很强大。

$ grep [OPTION...] PATTERNS [FILE...]
$ grep [OPTION...] -e PATTERNS ... [FILE...]      # 使用egrep
$ grep [OPTION...] -f PATTERN_FILE ... [FILE...]  # 使用fgrep

常用的参数为:

  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同
  • -v 或 --invert-match : 显示不包含匹配文本的所有行
  • -i 或 --ignore-case : 忽略字符大小写的差别
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

假定有如下3个文件,1个文件夹,内容如下:

a
    This is a
    Hello a
    
b 
    this is b
    Hello b
c 
    This is c
    Hello c

d/d 
    This is d
    Hello d

默认无参数

在当前目录搜索包含is字符串,可以看到**a/b/c**三个文件均有输出,而d因为是目录,暂时无输出。

$ grep is *
a:This is a
b:this is b
c:This is c
grep: d: Is a directory

增加文件夹

与其他命令类似,增加-r参数,递归搜索

$ grep -r is *
a:This is a
b:this is b
c:This is c
d/d:This is d

反向查找

在某些情况下,或许正想找到不包含某些字符串的内容,如下:

$ grep -rv is *
a:Hello a
b:Hello b
c:Hello c
d/d:Hello d

此时可以看到,不包含is的内容显示了出来。

不区分大小写

而某些情况下,或许我们希望找到不区分大小写的内容,比如对于This/this而言:

$ grep -r This *
a:This is a
c:This is c
d/d:This is d

$ grep -ri This *
a:This is a
b:this is b
c:This is c
d/d:This is d

可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。

显示行数,精准定位

如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n参数既可解决。

$ grep -rn This *
a:1:This is a
c:1:This is c
d/d:1:This is d

linux 之gunzip命令

… _linux-beginner-gunzip:

官方的定义为:

gzip, gunzip, zcat – compression/decompression tool using Lempel-Ziv coding (LZ77)

参考gunzip命令

使用的方法为:

$ uname [OPTION]...

常用的一些选项为:

  • -a, --all:打印全部的信息
  • -s, --kernel-name:打印内核名
  • -n, --nodename:打印网络节点hostnme,即主机名
  • -r, --kernel-release:打印内核发行版
  • -v, --kernel-version:打印内核版本
  • -m, --machine:打印机器的硬件名字
  • -p, --processor:打印processor或者unknown
  • -i, --hardware-platform:打印硬件平台或者“unknown”
  • -o, --operating-system:打印操作系统

语法

$ unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>]unzip [-Z]

参数

  • -c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
  • -f 更新现有的文件。
  • -l 显示压缩文件内所包含的文件。
  • -p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
  • -t 检查压缩文件是否正确。
  • -u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
  • -v 执行是时显示详细的信息。
  • -z 仅显示压缩文件的备注文字。
  • -a 对文本文件进行必要的字符转换。
  • -b 不要对文本文件进行字符转换。
  • -C 压缩文件中的文件名称区分大小写。
  • -j 不处理压缩文件中原有的目录路径。
  • -L 将压缩文件中的全部文件名改为小写。
  • -M 将输出结果送到more程序处理。
  • -n 解压缩时不要覆盖原有的文件。
  • -o 不必先询问用户,unzip执行后覆盖原有文件。
  • -P<密码> 使用zip的密码选项。
  • -q 执行时不显示任何信息。
  • -s 将文件名中的空白字符转换为底线字符。
  • -V 保留VMS的文件版本信息。
  • -X 解压缩时同时回存文件原来的UID/GID。
  • [.zip文件] 指定.zip压缩文件。
  • [文件] 指定要处理.zip压缩文件中的哪些文件。
  • -d<目录> 指定文件解压缩后所要存储的目录。
  • -x<文件> 指定不要处理.zip压缩文件中的哪些文件。
  • -Z unzip -Z等于执行zipinfo指令。

实例

查看压缩文件中包含的文件:

# unzip -l abc.zip 
Archive: abc.zip
 Length   Date  Time  Name
  94618 05-21-10 20:44  a11.jpg
  202001 05-21-10 20:44  a22.jpg
    16 05-22-10 15:01  11.txt
  46468 05-23-10 10:30  w456.JPG
  140085 03-14-10 21:49  my.asp
  483188          5 files

-v 参数用于查看压缩文件目录信息,但是不解压该文件。

# unzip -v abc.zip 
Archive: abc.zip
Length  Method  Size Ratio  Date  Time  CRC-32  Name
  94618 Defl:N  93353  1% 05-21-10 20:44 9e661437 a11.jpg
 202001 Defl:N  201833  0% 05-21-10 20:44 1da462eb a22.jpg
   16 Stored    16  0% 05-22-10 15:01 ae8a9910 ? +-|¥+-? (11).txt
  46468 Defl:N  39997 14% 05-23-10 10:30 962861f2 w456.JPG
 140085 Defl:N  36765 74% 03-14-10 21:49 836fcc3f my.asp
 483188      371964 23%              5 files

解压命令之一 gzip

… _linux-beginner-gzip:

:ref:unzip<linux-beginner-unzip>

gzip用于对后缀为gz文件进行解压:

$ gzip -d data.gz

这个命令将解压examplefile.gz,并且在当前目录下生成一个名为data的解压后的文件。

但特别需要留意的是,这个操作会删除源文件,会删除源文件,会删除源文件。

所以如果你想保留原始压缩文件,一定记得使用-k选项:

$ gzip -dk data.gz

这会保留原始的data.gz文件,并生成一个解压后的data文件。

Linux halt 命令

参考 Linux reboot 命令。—

从头开始的head

… note::
待从头、收拾旧山河,朝天阙。
宋代 岳飞《满江红·写怀》

head命令用来查看文件头部的n行,如果没有指定的n,默认显示10行。

官方定义:

head - output the first part of files

命令格式

$ head [option] [filename]  

参数option比较常用的如下所示:

  • -c <数目> 显示的字节数
  • -n <行数> 显示文件的头部 n 行内容

常规使用

假定文件 text.txt 有 20 行,从 1-20 ,默认情况下的使用如下,显示前面的10行:

$ head text.txt
1
2
3
4
5
6
7
8
9
10

显示 前 N 行

显示 text.txt 文件的开头 5 行,可以输入以下命令:

$ head -n 5 text.txt

按照字节显示

显示文件前 20 个字节:

$ head -c 20 text.txt
1
2
3
4
5
6
7
8
9

history命令 – 显示与处理历史命令

history命令用于显示用户以前执行过的历史命令,并且能对历史命令进行追加和删除等操作。

如果你经常使用Linux命令,那么使用history命令可以有效地提升你的效率。

语法比较简单:

$ history [OPTIONS] [..]

常用参数:

  • -a 将当前shell会话的历史命令追加到命令历史文件中,命令历史文件是保存历史命令的配置文件
  • -c 清空当前历史命令列表
  • -d 删除历史命令列表中指定序号的命令
  • -n 从命令历史文件中读取本次Shell会话开始时没有读取的历史命令

显示所有的历史命令

$ history

 	1  sudo apt get update
    2  sudo apt update
    3  sudo apt upgrade
    4  sudo apt install vim
    5  ls
    6  pwd
    7  cd
    8  ls
    9  sudo apt install vim
   10  sudo apt search pgplot
   11  bash go.sh
   12  sudo apt install zsh
   13  bash down.sh
   14  exit
   15  echo $PS1
   16  bash
   17  exit
   18  sh test.sh
   19  bash
   20  exit
   21  rsync -rv --progress user@192.168.1.123:~/data1/ .
   22  rsync -rv --progress user@192.168.1.123:~/src/ . 
   ......

列出最近的几条命令

history后面跟上数字,就可以列出最近的几条命令:

$ history 3
   8540  pwd
   8541  echo $PATH
   8542  git status

删除部分命令

可以通过-d参数来删除某一条或者某些历史命令,支持正则表达式

# 删除第35条历史命令
$ history -d 35

# 删除第31到39条历史命令
$ histor -d 3{1..9}

删除全部命令

如果登陆某些调试机器,后面将不在使用,考虑到安全性,可以删除操作过的所有历史,通过-c参数,即clear的意思。

$ history -c

此时将没有任何历史操作。

进阶 - 如何获取使用的命令及频率

$ history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort –nr

    967 ls
    507 cd
    199 vim
    199 python
    165 cp
    152 less
    105 mv
     95 rm
     94 ll
     90 echo
     85 bash
     72 cat
     66 apt
     59 pwd
     51 mkdir
     ...
```---

# Linux 的 Hostname命令

正常情况下,系统启动的时候我们就会设置`hostname`。

不过大部分哥们在安装的时候估计不会特别在意。不过如果在管理或者登录的计算机比较多的情况下,设置主机名就是一件特别需要留意的事情了。

至少在设置了主机名后你就会知道`ssh`登录的是那台系统。



官方定义为:

> hostname - show or set the system's host name



`hostname`命令用于显示和设置系统的主机名称。环境变量**HOSTNAME** 或者 **HOST** 保存了当前的主机名。



使用方法为:

```bash
$ hostname [-b|--boot] [-F|--file filename] [hostname]

基本的使用为查看和修改。

临时更改运行系统的主机名

系统如果正在运行,可以直接使用hostname来临时更改主机名,在系统重启前,都会保证有效。

命令如下:

$ hostname NEW_HOSTNAME

注意这个命令话系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。

永久更改主机名

这里分为两种情况,主要为基于两种不同的主流发行版,需要修改文件,需要管理员权限。

Debian系列

基于Debian系统的设置在文件/etc/hostname,系统启动时会读取该文件并调用初始化脚本/etc/init.d/hostname.sh

所以对于这类系统可以通过修改编辑文件/etc/hostname来更改。

/etc/init.d/hostname.sh start

修改完毕后,这个命令可以立即更改。

Redhat系列

基于RedHat的系统使用文件 /etc/sysconfig/network来设置。可以通过修改该文件并使用hostname命令来设置。

还有其他的方法,你知道吗?

显示硬件信息的hwinfo

hwinfo 又一个用于显示硬件信息的命令。

可以获得 Linux 系统的各种硬件组件(如CPU、内存、显卡、硬盘等)的详细信息。

显示所有硬件信息

sudo hwinfo

列出系统上几乎所有可用硬件的详细信息。

指定特定硬件信息

sudo hwinfo --cpu
sudo hwinfo --memory
sudo hwinfo --gfxcard
sudo hwinfo --disk

通过在命令后添加 --cpu--memory--gfxcard--disk 等参数,获取特定硬件的信息。

id 我也是有身份…证的人

id命令用于显示用户的以及其所属群组的ID。

官方定义为:

id - print real and effective user and group IDs

语法

$ id [OPTION]... [USER]

参数说明

  • -g, --group:仅仅显示组的ID
  • -G, --groups:显示所有组的IDs
  • -u, --user:打印用户的ID

默认使用

显示当前用户信息

$ id 
uid=1000(user) gid=1000(user) groups=1000(user),980(data),1006(monitor)

可以看到用户user的ID及组ID均为1000,该用户还属于data和monitor组。

显示用户群组的ID

$ id -g
1000

仅显示用户组的ID

查看网络信息的原初 ifconfig

Linux ifconfig命令用于显示或设置网络设备,在调试或调优的时间经常使用。

官方定义为:

ifconfig - configure a network interface

对于这个命令,一般只要掌握如何查看,如何设置IP地址基本就可以了,对于网络钻的比较深的,还需要更多一些参数。

使用方法为:

# 显示
$ ifconfig [-v] [-a] [-s] [interface]

# 设置
$ ifconfig [-v] interface [aftype] options | address ...

一些参数的含义为:

  • -a :显示所有网卡的状态,即使是down的状态
  • -s:显示一个短列表
  • interface mtu N 设置最大传输单元【需要管理员权限】
  • netmask addr:设置掩码地址【需要管理员权限】
  • interface up 激活网卡【需要管理员权限】
  • interface down 关闭网卡【需要管理员权限】
  • interface hw ether xx.xx.xx.xx.xx.xx 设置MAC地址【需要管理员权限】

默认无参数使用

如果不指定任何参数,直接显示当前活动的接口,如下:

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.123  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 5634431  bytes 4994127142 (4.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 858051  bytes 109858013 (104.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xc7320000-c733ffff  

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 219608  bytes 105943591 (101.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 219608  bytes 105943591 (101.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

其中一般希望看到的信息包括:

  • inet:为IP地址
  • ether:为MAC地址
  • MTU:最大传输单元

不加任何参数只会显示已经配置并且活跃的网卡信息,如果使用ifconfig -a就可以显示全部的网卡状态了,即使有些网卡是down的状态。

亦或者指定一个interface,比如上面的eth1,则只输出这个网卡的信息,如下:

$ ifconfig eth1

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

-s显示短列表

如果只想看到MTU以及数据包的状态,可以用该参数,如下:

$ ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0     1500   5665450      0      0 0        867639      0      0      0 BMRU
eth1     1500   3489187217   0 101054 0      501260400     0      0      0 BMU
lo       65536  219708       0      0 0        219708      0      0      0 LRU

输出信息主要包含了MTU值,发送及接收的数据情况。

配置IP地址

如下对eth0网卡配置IP地址、掩码以及广播地址,当然可以分布操作

# 给eth0配置IP地址
$ ifconfig eth0 192.168.1.123 

# 给eth0配置IP地址和子网掩码
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 

# 给eth0配置IP地址、子网掩码还有广播地址
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255

修改MTU

在某些情况下可能需要修改MTU值,比如增到到MTU为9000,如下:

$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 修改MTU
$ ifconfig eth1 MTU 9000

$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

已经看到输出的信息已经把mtu更新为了9000.

这个值对网络传输影响很大。

启动关闭网卡

启动关闭主要的应用场景为重新设置了IP地址,或者暂时对某个网卡进行操作。

# 关闭eth0
$ ifconfig eth0 down

# 启动eth0
$ ifconfig eth0 up

不过需要注意的是

  1. 很多的设置操作都需要管理员权限;
  2. 很多操作在重启后设置都会还原,如果需要永久设置,需要更改network的一些配置文件;
  3. 这个程序基本被淘汰了,已经不在更新,所有的操作或者用法均可以通过ip来搞定。等明天~。

网络配置的大拿 ip

Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要用于显示或设置网络设备。

已经在Linux 2.2 加入到了内核。所以ip是加强版的网络配置工具,用来替代ifconfig并强化其他功能。

官方定义为:

ip - show / manipulate routing, devices, policy routing and tunnels

对于这个命令,命令集是相当的多。先说一些基础的,其他就要自己摸索了。

使用方法为:

$ ip [ OPTIONS ] OBJECT { COMMAND | help }

$ ip [ -force ] -batch filename
   
# OBJECT的取值   
# OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec }

# OPTIONS的取值  
# OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name | -a[ll] | -c[olor] }

COMMAND的值主要取决于OBJECT,可能有所不同,一般可以使用adddeleteshow(或者list),均可以输入help来进行查询。

OBJECT中常用的为:

  • link 网络设备
  • address 设备上的协议地址
  • -s, -stats, -statistics 统计化输出

显示网络设备

# 显示网络设备
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

# 显示IP等更多信息
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.123/24 brd 192.168.254.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

命令中的show为默认,也可以直接使用ip link或者ip address,结果一致。

设置IP地址

可以通过ip addr add/del xxx.xxx.xxx.xxx dev interface 来设置或者删除IP地址。

如下设置or删除eth0的IP地址。

# 设置IP地址
$ ip addr add 192.168.0.1/24 dev eth0 

# 删除IP地址
$ ip addr del 192.168.0.1/24 dev eth0 

启动关闭网卡

与ifconfig类似,也使用up与down来进行启动和关闭,具体如下:

# 开启网卡
$ ip link set eth0 up             

# 关闭网卡
$ ip link set eth0 down           

统计方便阅读

选项-s可以统计一些信息方便我们阅读,如下看看网络的情况:

$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast   
    871883256468 251700492 0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    871883256468 251700492 0       0       0       0       
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    64930085920632 50955323447 0       613156  0       472190933 
    TX: bytes  packets  errors  dropped carrier collsns 
    17534345850354 17448077191 0       0       0       0       
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0  

可以看到对输出进行了一些格式化,看起来更直观。

Linux join命令

… note::
劝君莫惜金缕衣,劝君惜取少年时。

Linux join命令用于将两个文件中指定栏位内容相同的行连接起来。

找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

官方解释为:

join - join lines of two files on a common field

语法为:

$  join [OPTION]... FILE1 FILE2

这个命令的参数还是有一些的,不过基本默认的足够使用了。

join实例

最简单的连接两个文件。

首先看一下两个文件的内容,然后进行join操作。

# 查看file1、file2 的文件内容:
$ cat file1 
Zhangsan age 14
Lisi     age 15
Wangwu   age 16

$ cat file2
Zhangsan score 80
Lisi     score 90
Wangwu   score 85

# 使用join命令
$ join file1 file2
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85

# 交互两个文件的顺序
$ join file2 file1
Zhangsan score 80 age 14
Lisi score 90  age 15
Wangwu score 85 age 16

可以看到交换顺序对输出是由影响的,会影响到最终的输出内容。

不同的栏内容进行join操作

而如果两个文件的内容不同,那么在进行join操作时会有警告信息输出,如下所示:

$ cat file1       
Jialiu   age 15
Zhangsan age 14
Lisi     age 15
Wangwu   age 16
$ cat file2       
Zhangsan score 80
Lisi     score 90
Wangwu   score 85
Jialiu   score 88
$ join file1 file2
join: file1:3: is not sorted: Lisi     age 15
join: file2:2: is not sorted: Lisi     score 90
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85
$ join file2 file1
join: file2:2: is not sorted: Lisi     score 90 
join: file1:3: is not sorted: Lisi     age 15
Zhangsan score 80 age 14
Lisi score 90  age 15
Wangwu score 85 age 16

TODO

语法

join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]

参数

  • -a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
  • -e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
  • -i或–igore-case 比较栏位内容时,忽略大小写的差异。
  • -o<格式> 按照指定的格式来显示结果。
  • -t<字符> 使用栏位的分隔字符。
  • -v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
  • -1<栏位> 连接[文件1]指定的栏位。
  • -2<栏位> 连接[文件2]指定的栏位。

-a FILENUM
also print unpairable lines from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2

-e EMPTY
replace missing input fields with EMPTY

-i, --ignore-case
ignore differences in case when comparing fields

-j FIELD
equivalent to ‘-1 FIELD -2 FIELD’

-o FORMAT
obey FORMAT while constructing output line

-t CHAR
use CHAR as input and output field separator

-v FILENUM
like -a FILENUM, but suppress joined output lines

-1 FIELD
join on this FIELD of file 1

-2 FIELD
join on this FIELD of file 2

–check-order
check that the input is correctly sorted, even if all input lines are pairable

–nocheck-order
do not check that the input is correctly sorted

–header
treat the first line in each file as field headers, print them without trying to pair them

-z, --zero-terminated
line delimiter is NUL, not newline

   Unless -t CHAR is given, leading blanks separate fields and are ignored, else fields are separated by CHAR.  Any FIELD is a  field
   number counted from 1.  FORMAT is one or more comma or blank separated specifications, each being 'FILENUM.FIELD' or '0'.  Default
   FORMAT outputs the join field, the remaining fields from FILE1, the remaining fields from FILE2, all separated by CHAR.  If FORMAT
   is the keyword 'auto', then the first line of each file determines the number of fields output for each line.

   Important:  FILE1 and FILE2 must be sorted on the join fields.  E.g., use "sort -k 1b,1" if 'join' has no options, or use "join -t
   ''" if 'sort' has no options.  Note, comparisons honor the rules specified by 'LC_COLLATE'.  If the input is not sorted  and  some
   lines cannot be joined, a warning message will be given.

​ comm(1), uniq(1)

Linux 之 kill 命令

… _linux-beginner-kill:

Linux kill 命令用于删除执行中的程序或工作。

官方含义为:

kill - send a signal to a process

kill命令可将指定的信号发送给相应的进程或工作。 kill命令默认使用的信号为15(SIGTERM),用于结束进程或工作。如果进程或工作忽略此信号,则可以使用信号9(SIGKILL),强制杀死进程或作业。程序或工作的编号可利用 ps 指令或 jobs 指令查看。

语法

$ kill [option] <pid> [...]

参数说明

  • -l <信息编号>  若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。
  • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

所有可用的信号

使用 kill -l 命令列出所有可用信号。

$  kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

其中最常用的信号为:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

几个实例

杀死进程

$ kill 12345

强制杀死进程

$ kill -KILL 123456
# 或者
$ kill -9 123456

那么如何kill某个用户的所有进程呢,比如用户为user,可以通过下面的命令执行:

$ kill -9 $(ps -ef | grep user) 
# 或者
$ kill -u user

Linux 之 killall 命令

… _linux-beginner-killall:

… note::
及时当勉励,岁月不待人。
陶渊明《杂诗·人生无根蒂》

命令概述

在Linux系统中,有许多命令可用于进程管理和控制。

其中一个常用的命令是killall,它允许用户通过进程名字来终止运行中的进程。

官方定义为:

killall – kill processes by name

killall命令用于向操作系统发送信号以终止指定进程。与kill命令不同,killall根据进程名字而不是进程ID来选择要终止的进程。这对于同时终止多个同名进程非常有用。

超级管理员可以kill掉任何进程。

基本语法

killall命令的基本语法如下:

$ killall [选项] 进程名

可以使用以下选项对killall命令进行调整:

  • -i:交互式模式,要求用户确认终止每个进程。
  • -e:精确匹配进程名,不匹配进程名的任何子串。
  • -s:指定要发送的信号类型,如-s HUP
  • -v:显示详细的终止进程的输出。

使用示例

终止单个进程

要终止单个进程,可以使用以下命令:

$ killall 进程名

比如:

$ killall firefox

这将终止所有名为firefox的进程。

终止多个进程

要同时终止多个同名进程,可以使用以下命令:

$ killall -r 进程名

示例:

$ killall -r chrome

这将终止所有以chrome为名的进程,包括chromechromium等等。

交互式模式

使用-i选项可以在终止每个进程之前要求用户确认。示例:

$ killall -i firefox

在执行此命令时,系统将逐个显示要终止的进程,并要求用户确认是否继续,这个对于不确定是否一定中止的优点用哟。

指定信号类型

可以使用-s选项来指定要发送的信号类型。示例:

$ killall -s HUP nginx

这将向所有名为nginx的进程发送HUP信号,以重新加载配置。

综上

killall命令是一个强大的进程管理工具,可帮助用户终止指定名称的进程。它简化了终止多个同名进程的操作,并提供了一些有用的选项,如交互式模式和指定信号类型。在日常的系统管理和故障排除中,killall是一个重要的工具,

所有可用的信号

使用 kill -l 命令列出所有可用信号。

$  kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

其中最常用的信号为:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

几个实例

杀死进程

$ kill 12345

强制杀死进程

$ kill -KILL 123456
# 或者
$ kill -9 123456

那么如何kill某个用户的所有进程呢,比如用户为user,可以通过下面的命令执行:

$ kill -9 $(ps -ef | grep user) 
# 或者
$ kill -u user

SYNOPSIS
killall [-delmsvqz] [-help] [-I] [-u user] [-t tty] [-c procname] [-SIGNAL] [procname …]

 The options are as follows:

 -d                 Be more verbose about what will be done, but do not send any signal.  The total number of user processes and the real user ID is shown.  A list of the processes that
                    will be sent the signal will be printed, or a message indicating that no matching processes have been found.

 -e                 Use the effective user ID instead of the (default) real user ID for matching processes specified with the -u option.

 -help              Give a help on the command usage and exit.

 -I                 Request confirmation before attempting to signal each process.

 -l                 List the names of the available signals and exit, like in kill(1).

 -m                 Match the argument procname as a (case sensitive) regular expression against the names of processes found.  CAUTION!  This is dangerous, a single dot will match any
                    process running under the real UID of the caller.

 -v                 Be verbose about what will be done.

 -s                 Same as -v, but do not send any signal.

 -SIGNAL            Send a different signal instead of the default TERM.  The signal may be specified either as a name (with or without a leading “SIG”), or numerically.

 -u user            Limit potentially matching processes to those belonging to the specified user.

 -t tty             Limit potentially matching processes to those running on the specified tty.

 -c procname        Limit potentially matching processes to those matching the specified procname.

 -q                 Suppress error message if no processes are matched.

 -z                 Do not skip zombies.  This should not have any effect except to print a few error messages if there are zombie processes that match the specified pattern.

ALL PROCESSES
Sending a signal to all processes with the given UID is already supported by kill(1). So use kill(1) for this job (e.g. “kill -TERM -1” or as root “echo kill -TERM -1 | su -m
”).

IMPLEMENTATION NOTES
This FreeBSD implementation of killall has completely different semantics as compared to the traditional UNIX System V behavior of killall. The latter will kill all processes that the
current user is able to kill, and is intended to be used by the system shutdown process only.

EXIT STATUS
The killall utility exits 0 if some processes have been found and signalled successfully. Otherwise, a status of 1 will be returned.

EXAMPLES
Send SIGTERM to all firefox processes:

       killall firefox

 Send SIGTERM to firefox processes belonging to USER:

       killall -u ${USER} firefox

 Stop all firefox processes:

       killall -SIGSTOP firefox

 Resume firefox processes:

       killall -SIGCONT firefox

 Show what would be done to firefox processes, but do not actually signal them:

       killall -s firefox

 Send SIGTERM to all processes matching provided pattern (like vim and vimdiff):

       killall -m 'vim*'

DIAGNOSTICS
Diagnostic messages will only be printed if the -d flag is used.

SEE ALSO
kill(1), pkill(1), sysctl(3)

还有谁 last

… note::
夕阳无限好,只是近黄昏。
李商隐《乐游原 / 登乐游原》

Linux last 命令用于显示用户最近的登录信息。

官方定义为:

last, lastb - show listing of last logged in users

通过读取/var/log/wtmp文件来获取这些信息。

语法

$ last [-R] [-num] [ -n num ] [-adFiowx] [ -f file ] [ -t YYYYMMDDHHMMSS] [name...]  [tty...]

参数

  • -R 省略 hostname 的栏位

  • -n 展示前 num 个

  • username 展示 username 的登入讯息

  • tty 限制登入讯息包含终端机代号

一般使用方法

$ last
username2  pts/17       192.168.100.123  Wed Mar 23 22:14   still logged in
username3  pts/20       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/4        192.168.100.125    Thu Jun 10 18:37 - 22:57  (04:20)
username5  pts/4        192.168.100.125    Thu Jun 10 18:21 - 18:21  (00:00)
username6  pts/9        192.168.100.126    Thu Jun 10 18:11 - 18:20  (00:09)
username7  pts/15       192.168.100.122    Thu Jun 10 18:04 - 23:44 (1+05:40)
username8  pts/14       192.168.100.121    Thu Jun 10 17:59 - 07:50  (13:50)
username9  pts/9        192.168.100.126    Thu Jun 10 17:59 - 18:03  (00:04)

wtmp begins Thu Jun 10 17:33:14 2013

查看最近登陆的三个用户

$ last -3

username2  pts/17       192.168.100.123  Wed Mar 23 22:14   still logged in
username3  pts/20       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

省略hostname

$ last -3 -R
username2  pts/17         Wed Mar 23 22:14   still logged in
username3  pts/20         Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23         Wed Mar 23 14:26 - 15:48  (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

显示最后一列显示主机IP地址

$ last -n 5 -a -i
username3  pts/17       Wed Mar 23 22:14   still logged in    192.168.100.123
username5  pts/20       Wed Mar 23 14:26 - 15:48  (01:21)     0.0.0.0
username6  pts/23       Wed Mar 23 14:26 - 15:48  (01:21)     0.0.0.0
username7  pts/19       Wed Mar 23 13:46 - 15:48  (02:01)     192.168.100.123
username8  pts/17       Wed Mar 23 13:18 - 15:47  (02:29)     192.168.100.123

wtmp begins Thu Jun 10 17:33:14 2013

less - 少就是多

Linux系统如果希望查阅文件,有三个命令,是在命令行里面,如果GUI界面,请自行绕过,选择太多了。

  • cat 入门级的
  • more 文件内容一屏幕装不下的时候使用的
  • less 可以简单地认为是more的升级版 , 首推

我首推less命令的原因是该命令可以往回卷动浏览已经看过的部分,但是more是不可以的。或者可以认为less是查看模式下的vim

首先看看为什么用less命令吧。

If the file is longer than the size of Terminal window then it will be not easy to read or view all the content of the file easily. But there is a tweak, you can use less with cat command. It will give user an ability to scroll forward and backward through the content of the files using PgUp and PgDn keys or Up and Down Arrow keys on the keyboard.

如题,在文件内容足够多的时候,屏幕足够不大的时候,就会出现上面描述的问题,这就出现了less命令。

Linux系统可以说把少就是多这个哲学用到了极致,恰如小巧优美的C语言,不该有的功能坚决不给你提供,应该有的也不给你提供,哈哈,比如内存的管理,程序员就是神,你就是神。

命令简介

less - opposite of more # 我觉得这是废话

我嘞个去,什么鬼?这是什么意思,我也知道少的反义词是多,大的反义词是小。

别急,那就看看more的含义吧,不会是 opposite of less 吧。OMG

more - file perusal filter for crt viewing

什么意思,淡定,听我说,在Linux系统中有三种命令可以用来查阅全部的文件,分别是catmoreless命令,关于more的解释主要针对在上古年代的计算机,你不理解crt也没有关系,毕竟现在已经是Retina的年代了。

一起看看下面的实例吧。

命令格式

less [参数] 文件

与其他命令类似,直接跟上文件名即可。

接下来依旧使用/etc/services来进行示例。

-m 显示类似more命令的百分比

这个是more命令比较好用的一个功能,可以显示目前浏览的百分比。

$ less -m /etc/services

auditd          48/udp                  # Digital Audit Daemon
la-maint        51/tcp                  # IMP Logical Address Maintenance
la-maint        51/udp                  # IMP Logical Address Maintenance
xns-time        52/tcp                  # XNS Time Protocol
xns-time        52/udp                  # XNS Time Protocol
xns-ch          54/tcp                  # XNS Clearinghouse
xns-ch          54/udp                  # XNS Clearinghouse
isi-gl          55/tcp                  # ISI Graphics Language
isi-gl          55/udp                  # ISI Graphics Language
xns-auth        56/tcp                  # XNS Authentication
xns-auth        56/udp                  # XNS Authentication
xns-mail        58/tcp                  # XNS Mail
xns-mail        58/udp                  # XNS Mail
ni-mail         61/tcp                  # NI MAIL
ni-mail         61/udp                  # NI MAIL
5%

此时可以在左下角看到,有个百分比。

-N 显示行号

使用-N可以实现cat中-n的效果,显示行号

      $ less -N /etc/services
      1 # /etc/services:
      2 # $Id: services,v 1.55 2013/04/14 ovasik Exp $
      3 #
      4 # Network services, Internet style
      5 # IANA services version: last updated 2013-04-10
      6 #
      7 # Note that it is presently the policy of IANA to assign a single well-known
      8 # port number for both TCP and UDP; hence, most entries here have two entries
      9 # even if the protocol doesn't support UDP operations.
     10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
     11 # are included, only the more common ones.
     12 #
     13 # The latest IANA port assignments can be gotten from
     14 #       http://www.iana.org/assignments/port-numbers
     15 # The Well Known Ports are those from 0 through 1023.
     16 # The Registered Ports are those from 1024 through 49151

搜索字符串

在less中,可以比较容易的搜索字符串,比如可以:

  • /字符串:向下搜索“字符串”的功能
  • ?字符串:向上搜索“字符串”的功能
  • n:重复前一个搜索(与 / 或 ? 有关)
  • N:反向重复前一个搜索(与 / 或 ? 有关)

其实这些功能或者热键与vim相同。

在用less打开文件后,可以直接输入/number来搜索nubmer这个字符串,回车后可以看到该字符串高亮显示,这个也是优于more的一点;同样?number可以反向搜索number字符串。

可以通过-i选项来忽略搜索时的大小写

设置缓冲区的大小

可以通过-b <缓冲区大小> 设置缓冲区的大小,这个一般用于文件很大、巨大、不是一般大的时候,此时你的内容可能不足以承载打开整个文件,比如4G的内存,而你却要打开10G的文件,此时可以通过该选项来设置,默认单位为KB,比如

$ less -b 1024 filename

即打开1024KB的文件缓冲

编辑less浏览的文件

要编辑一个正在用less浏览的文件,可以按下v。你就可以用变量$EDITOR所指定的编辑器来编辑了: 按下v键来编辑文件,退出编辑器后,你可以继续用less浏览了。

移动

我比较喜欢less的原因是对于该命令的很多操作都是与vim相同,而我是一个重度vimer,so 推荐less

说几个比较简单的移动:

  • j 向下移动
  • k 向上移动
  • g 移动到第一行
  • G 移动到最后一行
  • b 向后翻一页
  • d 向后翻半页
  • u 向前滚动半页
  • y 向前滚动一行
  • 空格键 滚动一行
  • 回车键 滚动一页

Linux ln 命令

ln 命令是一个非常重要的命令,可以为某一个文件或目录在其他不同的位置建立一个同步的链接。部分功能与Windows的快捷方式类似。但更加强大。

官方解释为:

ln - make links between files

当我们需要在不同的目录,或者不同的工程,甚至是不同的人员需要用到同一个文件的时候,此时不需要每个位置都通过cp来拷贝一份,因为在源文件更新的时候,这个文件是不会同步更新的 。而此时ln命令就不一样了,通过该命令链接到源文件或目录,不仅可以不用占用重复的更多的磁盘空间,还可以同步更新。NICE

使用格式

 $ ln [参数][源文件或目录][目标文件或目录]

其中参数的格式为

  • -b ,或 like --backup but does not accept an argument
  • -f,或 --force : 强制执行,这个在链接已经存在的情况下必用
  • -s,或 --symbolic:创建符号链接

在Linux文件系统中,又有两种链接类型:

  1. 硬链接(hard link)
  2. 软链接(symbolic link):又称符号链接,类似于Windows的快捷方式

硬链接会复制一份相同大小的源文件,而软链接是一种特殊的文件,占用很小的磁盘空间。

创建硬链接

默认情况下,不加任何参数,创建的是硬链接,如下,创建源文件a.log的硬链接a1.log

$ ln a.log a1.log

$ ll
-rw-rw-r--. 3 user user 85710 Apr  5 21:29 a.log
-rw-rw-r--. 3 user user 85710 Apr  5 21:29 a1.log

这个时候修改源文件a.log的部分内容,可以看到硬链接也同步更新。

$ vim a.log

$ ll
-rw-rw-r--. 3 user user 85716 Apr  5 21:34 a.log
-rw-rw-r--. 3 user user 85716 Apr  5 21:34 a1.log

创建软链接

如果需要创建软链接,就需要参数-s,如下,创建源文件a.log的软链接a1.log

$ ln -s a.log a1.log

$ ll
-rw-rw-r--. 3 user user 85710 Apr  5 21:29 a.log
lrwxrwxrwx. 1 user user     5 Apr  5 21:30 a1.log -> a.log

这个时候修改源文件a.log的部分内容,可以看到软链接没有更新,不过其指向的内容依然更新了。

$ vim a.log

$ ll
-rw-rw-r--. 3 user user 85716 Apr  5 21:34 a.log
lrwxrwxrwx. 1 user user     5 Apr  5 21:30 a1.log -> a.log

此时可以看到,对于软链接a1.log而言,其仅为一个符号链接,用file看一下:

$ file a1.log
a1.log: symbolic link to `a.log'

删除源文件后的情况

此时通过ln创建a.log的硬链接ah.log和软链接as.log,然后看一下如果删除源文件会发生什么情况。

# 创建软硬链接
$ ln a.log ah.log
$ ln -s a.log as.log
$ ll
-rw-rw-r--. 2 user user 85716 Apr  5 21:34 a.log
lrwxrwxrwx. 1 user user     5 Apr  5 21:30 as.log -> a.log
-rw-rw-r--. 2 user user 85716 Apr  5 21:34 ah.log

# 删除源文件
$ rm a.log

# 此时如果有颜色显示,as.log应该会是红色的警告色
$ ll
lrwxrwxrwx. 1 user user     5 Apr  5 21:30 as.log -> a.log
-rw-rw-r--. 2 user user 85716 Apr  5 21:34 ah.log

# 此时看一下as.log的状态
$ file as.log
as.log: broken symbolic link to `a.log'

可以看到如果删除了源文件,硬链接不受影响,但是软链接已经提示链接损坏了。

强制更新软链接

在软链接存在的情况下,如果再创建一个同名的,会报错,此时就需要强制创建了,加上-f参数即可。

$ ln -s b.log as.log
ln: failed to create symbolic link 'as.log': File exists

# 强制创建
$ ln -sf b.log as.log

$ ll
-rw-rw-r--. 1 user user 85716 Apr  5 22:16 a.log
-rw-rw-r--. 2 user user 85716 Apr  5 21:34 ah.log
lrwxrwxrwx. 1 user user     5 Apr  5 22:21 as.log -> b.log
-rw-rw-r--. 1 user user 85716 Apr  5 22:17 b.log

精准快速定位的locate

… note::

众里寻他千百度,蓦然回首,那人却在灯火阑珊处

Linux locate命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。

一般情况我们只需要输入 locate name 即可查找。

官方定义为:

locate - list files in databases that match a pattern

使用方法为:

$ locate  [-d  path  |  --database=path]  [-e  | -E | --[non-]existing] [-i | --ignore-case] [-0 | --null] [-c |
       --count] [-w | --wholename] [-b | --basename] [-l N | --limit=N] [-S | --statistics] [-r | --regex ] [--regex‐
       type  R] [--max-database-age D] [-P | -H | --nofollow] [-L | --follow] [--version] [-A | --all] [-p | --print]
       [--help] pattern...

看着很复杂,不过常用的参数倒是不多,基本为:

  • -n : 至多显示 n个输出。
  • -i, --ignore-case : 忽略大小写

默认无参数

默认情况下,locate直接跟上需要查找的信息就可以了,如下所示:

$ locate set_vis.cpp
/home/user/mycode/src/set_vis.cpp

# 以查找apropos为例
$ locate apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/fr/man1/apropos.1.gz
/usr/share/man/id/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz
/usr/share/man/nl/man1/apropos.1.gz
/usr/share/man/pl/man1/apropos.1.gz
/usr/share/man/ru/man1/apropos.1.gz

太多需要简单化

如果输出的信息很多,仅仅希望看到前面的几个,使用-n参数既可

# 仅仅查看前的3个
$ locate -n 3 apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc

不区分大小写

部分情况下,可能有大小写混淆的情况,此时使用-i参数既可

$ $ locate -i set_vis.cpp
/home/user/mycode/src/set_vis.cpp
/home/user/mycode_CPP/src/set_VIS.cpp

📖 说明

不过刚按照的系统,这个命令并不一定有输出,主要是因为locatefind 不同, find 直接在硬盘找,而locate 只在数据库中查找。

这个数据库在CentOS系统默认的为 /var/lib/mlocate/mlocate.db 中,所以 locate 的查找会比较快,但并一定是实时的,而是以数据库的更新为准。

可以通过下面的命令手工升级数据库 ,命令为:

$ updatedb

然后就可以使用了。

最常用的且没有之一的 ls

… note::
寻寻觅觅,冷冷清清,凄凄惨惨戚戚。
宋 李清照《声声慢·寻寻觅觅》

如果linux命令来个排名,ls命令应该是最常用的命令,除非你像黄蓉的母亲,有过目不忘的本领,惹得黄药师抱憾终身。

ls命令是list的缩写,通过ls命令,我们可以查看目录的内容,确定各种重要文件和目录的属性。

命令格式

ls [参数] [路径]

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4   
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4

查看块设备的lsblk

lsblk 命令可以查看系统中的块设备信息

$ lsblk

这个命令会列出系统中所有的块设备(比如硬盘、分区和挂载点)的信息。

默认情况下,它会显示每个设备的名称、大小、类型、挂载点等信息。

如果需要显示更详细的信息,可以使用 -a--all 选项:

$ lsblk -a

这会显示完整的块设备信息,包括未挂载的设备。

当然,还可以根据需求,定制化输出,不过单单这个命令,足矣。

lscpu 显示CPU架构的有关信息

Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。
lscpusysfs/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 。
命令输出的信息包含cpu数量,线程,核数,socket和Nom-Uniform Memeor Access(NUMA),缓存等等。

官方定义为:

lscpu - display information about the CPU architecture

参数基本用处不大,默认即可,部分参数可以查看offline和online的设备信息。

默认实例

$ lscpu
Architecture:          x86_64       		#架构信息 
CPU op-mode(s):        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插槽核数/每颗物理cpu核数 
Socket(s):             2  					#cpu插槽数
NUMA node(s):          2
Vendor ID:             GenuineIntel 		#cpu厂商ID 
CPU family:            6   					#cpu系列 
Model:                 63 					#型号 
Model name:            Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz
Stepping:              2 					#步进 
CPU MHz:               1290.335 			#cpu主频
BogoMIPS:              4604.47
Virtualization:        VT-x  				#cpu支持的虚拟化技术 
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              40960K
NUMA node0 CPU(s):     0-15,32-47
NUMA node1 CPU(s):     16-31,48-63

其中几个概念需要理解清楚,基本比较重要的都有了备注。

其中第一个为CPU(s),这个值为Socket * Core * Thread得出,也就是逻辑的CPU个数。

CPU(s):                64   #逻辑CPU数
On-line CPU(s) list:   0-63
Thread(s) per core:    2     
Core(s) per socket:    16
socket:                2

而其他几个概念为:

  • Socket : 物理上的CPU插槽的数量,也就是物理的实体概念
  • Core:即平常说的单核、多核、四核等,即每个CPU上的核数
  • Thread:每个core上的线程数,即超线程。

列出系统硬件信息的lshw

lshwHardware Lister 的缩写,直面意思即列出系统硬件信息。

可以显示关于计算机硬件组件(如处理器、内存、硬盘、网卡等)的详细信息,对于系统管理员和用户来说是一个非常有用的工具。

显示所有硬件信息

任何参数都不加的话,可用,信息极多,但是可用信息不多。

 sudo lshw

这将输出系统中所有可用硬件的详细信息,包括硬件组件的制造商、型号、驱动程序等。

查看摘要硬件信息

显示摘要信息:相对而言,这个反而好一些,简单的就是有用的

sudo lshw -short

这将显示硬件的摘要信息,包括设备名、类别、描述等。

查看特定硬件信息(如网络、内存、硬盘等设备)

显示指定类型的硬件信息

sudo lshw -C network

上述示例将仅显示网络相关的硬件信息。

比如还可以查看memorycpudisk等信息。

lshw提供了全面的硬件信息,帮助用户了解系统配置和硬件组件的细节。在查看和诊断硬件问题或了解系统配置时,它是一个非常有用的工具。

lspci 显示当前设备的PCI总线信息

lspci命令用于显示PCI总线的信息,以及所有已连接的PCI设备信息。

官方定义为:

lspci - list all PCI devices

默认情况下,lspci会显示一个简短的设备列表。 使用使用一些参数来显示更详细的输出或供其他程序解析的输出。

不过需要注意的是,在许多操作系统上,对 PCI 配置空间的某些部分的访问仅限于 root,因此普通用户可用的 lspci 功能受到限制。

使用方法为:

$ lspci [options]

其中常用的三个选项为:

  • -n 以数字方式显示PCI厂商和设备代码
  • -t 以树状结构显示PCI设备的层次关系
  • -v 显示更详细的输出信息

显示当前主机的所有PCI总线信息:

默认无参数的显示

$ lspci
00:00.0 Host bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMI2 (rev 02)
00:01.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 (rev 02)
00:02.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 (rev 02)
00:03.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 (rev 02)
00:03.2 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 (rev 02)
00:04.0 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 0 (rev 02)
00:04.1 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 1 (rev 02)
00:04.2 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 2 (rev 02)
......

以数字方式显示PCI厂商和设备代码

以数字形式显示

$ lspci -n
00:00.0 0600: 8086:2f00 (rev 02)
00:01.0 0604: 8086:2f02 (rev 02)
00:02.0 0604: 8086:2f04 (rev 02)
00:03.0 0604: 8086:2f08 (rev 02)
00:03.2 0604: 8086:2f0a (rev 02)
00:04.0 0880: 8086:2f20 (rev 02)
00:04.1 0880: 8086:2f21 (rev 02)
00:04.2 0880: 8086:2f22 (rev 02)
......

同时显示数字方式还有设备代码信息

$ lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMI2 [8086:2f00] (rev 02)
00:01.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 [8086:2f02] (rev 02)
00:02.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 [8086:2f04] (rev 02)
00:03.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 [8086:2f08] (rev 02)
00:03.2 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 [8086:2f0a] (rev 02)
00:04.0 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 0 [8086:2f20] (rev 02)
00:04.1 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 1 [8086:2f21] (rev 02)
00:04.2 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 2 [8086:2f22] (rev 02)
......

以树状结构显示PCI设备的层次关系:

$ lspci -t
lspci -t
-+-[0000:ff]-+-08.0
 |           +-08.2
 |           +-1f.0
 |           \-1f.2
 +-[0000:80]-+-01.0-[81]----00.0
 |           +-04.0
 |           +-05.1
 |           +-05.2
 |           \-05.4
 +-[0000:7f]-+-08.0
 |           +-08.2
 |           +-0c.1
             \+-0c.2

常用参数:

-b以总线为中心的视图
-s仅显示指定总线插槽的设备和功能块信息
-i指定PCI编号列表文件,不使用默认文件
-m以机器可读方式显示PCI设备信息

如果您要报告 PCI 设备驱动程序或 lspci 中的错误
本身,请包括“lspci -vvx”甚至更好的“lspci”的输出
-vvxxx”(但是,请参阅下文了解可能的警告)。

此man非man的意思

首先,这man是什么意思?

最开始很多人认为是不知道这个什么意思,找man呀。

其实man是manual的缩写,也就是手册的意思。

man命令提供了系统命令的详细帮助信息。

Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。这个也是每个程序员必备的功能,在没有网络的情况下,man能解决很多问题和疑惑。

看一下官方定义:

Man - format and display the on-line manual pages

man 的格式

如果要读懂并使用man,首先需要了解man命令输出的格式,下面的几个是比较常用且需要注意的:

同时也可以使用man man 查看man的使用方法。

章节含义
NAME命令名称及功能简要说明
SYNOPSIS用法说明,包括可用的选项
DESCRIPTION命令功能的详细说明,可能包括每一个选项的意义
OPTIONS每一选项的意义
EXAMPLES一些使用示例

man的操作

比如输入man ls 后,跳出下面的内容:

LS(1)                                               User Commands                                              LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alphabetically if none of
       -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              scale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in  units  of  1,048,576
              bytes; see SIZE format below

       -B, --ignore-backups
 Manual page ls(1) line 1 (press h for help or q to quit)

此时可以通过空格键或者回车键来向后翻屏或者翻页,可以使用b或者k向前查看。

查看关键词时可以使用:

/关键词 向后查找 n:下一个

?关键词 向前查找 N:前一个

可以通过q来退出。

ls后面还有一个(1),详细的解释可以参考《Linux 安装 man 帮助程序》

类似于whatis命令

man有个参数为-f,就是whatis的功能,比如:

$ man -f ls cd file cat more less
ls (1)               - list directory contents
ls (1p)              - list directory contents
cd (1)               - bash built-in commands, see bash(1)
cd (1p)              - change the working directory
cd (n)               - Change working directory
file (1)             - determine file type
file (1p)            - determine file type
file (n)             - Manipulate file names and attributes
cat (1)              - concatenate files and print on the standard output
cat (1p)             - concatenate and print files
more (1)             - file perusal filter for crt viewing
more (1p)            - display files on a page-by-page basis
less (1)             - opposite of more
less (3pm)           - perl pragma to request less of something

与whatis命令完全一致

类似于apropos命令

man有个参数为-k,就是apropos的功能,比如:

$ man -k  who
at.allow (5)         - determine who can submit jobs via at or batch
at.deny (5)          - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1)                - Show who is logged on and what they are doing.
who (1)              - show who is logged on
who (1p)             - display who is on the system
whoami (1)           - print effective userid

与apropos命令完全一致

使用man的小技巧

如果遇到一个不熟悉或者完全不知道的命令,此时可以通过下面的3个步骤来了解:

  1. 首先用man -k command 查询所有类似帮助文件信息,或许有可能就能找到你需要的信息;
  2. 然后man -f command 查询以command开始的相关帮助信息列表
  3. man N command 通过直接定位N获得详细帮助信息

mkdir 创建文件夹

mkdir 命令用来创建指定的名称的目录,看看官方定义:

make directories

所以mkdir是这两个单词的缩写。mkdir要求创建目录的用户在当前目录中具有_写权限_,并且指定的目录名不能是当前目录中已有的目录,参数-p可以指定建立多级目录,这个参数也是用的最多的。

命令格式

mkdir [可选项] 目录

命令参数

  • -m, --mode=模式,设定权限<模式> (类似 chmod)
  • -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录

创建一个空目录

$ mkdir hello

递归创建多个目录

$ mkdir -p a/b/c/d/e/f/g

创建权限为777的目录

$ mkdir -m 777 test

小技巧 - 创建目录树

下面的一个命令可以创建一个项目的目录结构,如下:

$ mkdir -vp project/{src/,include/,lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}

mkdir: created directory ‘project’
mkdir: created directory ‘project/src/’
mkdir: created directory ‘project/include/’
mkdir: created directory ‘project/lib/’
mkdir: created directory ‘project/bin/’
mkdir: created directory ‘project/doc’
mkdir: created directory ‘project/doc/info’
mkdir: created directory ‘project/doc/product’
mkdir: created directory ‘project/logs’
mkdir: created directory ‘project/logs/info’
mkdir: created directory ‘project/logs/product’
mkdir: created directory ‘project/service’
mkdir: created directory ‘project/service/deploy’
mkdir: created directory ‘project/service/deploy/info’
mkdir: created directory ‘project/service/deploy/product’


$ tree project/

project
├── bin
├── doc
│   ├── info
│   └── product
├── include
├── lib
├── logs
│   ├── info
│   └── product
├── service
│   └── deploy
│       ├── info
│       └── product
└── src

14 directories, 0 files

more - 多多益善

more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

在查阅文件的时候,我们说过可以用cat命令,不过这个是入门级别的,但凡用了几天Linux的,基本不太会再使用cat,而是另外两个指令,more或者less。这次说一下more,more是在文件的内容一个屏幕装不小的时候使用的。而less是more的升级版本,稍后会介绍。

more : 文件内容一屏幕装不下的时候使用的

看看为什么用less命令吧。

more - file perusal filter for crt viewing

看不懂,什么是CRT,莫慌,关于more的解释主要针对在上古年代的计算机,你不理解crt也没有关系,毕竟现在已经是Retina的年代了。

命令格式

less的命令格式与cat一样,可以直接跟上文件名,如下:

less [参数] 文件

其中的参数如下所示:

  • +n 从笫n行开始显示
  • -n 定义屏幕大小为n行
  • +/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
  • -c 从顶部清屏,然后显示
  • -d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
  • -l 忽略Ctrl+l(换页)字符
  • -p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  • -s 把连续的多个空行显示为一行
  • -u 把文件内容中的下画线去掉

一起看看下面的实例吧,这里以文件/etc/services为例:

这个文件的开始信息如下:

# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp

+n 从第n行开始显示

接下来的命令从第10行开始显示:

$ more +10 /etc/service

# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote

可以看到前面的10行是没有显示的。

-n 定义屏幕大小为n行

这里的含义为定义输出的内容为10行,你的屏幕可能足够大,不过显示的内容只有n行,如下:只显示10行的内容,此时终端可能还会残留以前的内容:

$ more -10 /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports

可以关注一下,此时每次显示的只有10行。

+/pattern 搜寻字符串(pattern)

这个参数用于在文件中搜索字符串pattern,然后在该字符串的前两行之前开始显示。比如搜索number,会显示以下内容:

$ more +/number /etc/services
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
......

可以留意,此时显示的内容,第三行即包含搜索的字符串。

其他

除以上介绍的以外,还有比较容易理解的以下参数:

  • -c 从顶部清屏,然后显示
  • -p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  • -s 把连续的多个空行显示为一行
  • -u 把文件内容中的下画线去掉

mv文件移动或更名命令

mv命令用于移动文件或者重命名文件及文件夹。官方定义为:

mv : move files

语法

mv的语法与cp等其他语法类似,如下:

$ mv [options] source dest
$ mv [options] source ... directory

几个比较常用的选项如下:

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份,文件后缀用~表示;
  • -i或–interactive: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作,一般而言,对于不确定的时候可以用此选项,不过文件或文件夹居多时,最好不要用
  • -f或–force: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件,强制的意思force
  • -n或–no-clobber: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

常规操作

$ ls
a.txt

$ mv a.txt b.txt

$ ls
b.txt

直接移动或者叫做重命名,文件夹也类似的操作。

覆盖前备份

$ ls
a.txt  a.txt~

$ cp -b ../a.txt a.txt

$ ls
a.txt  a.txt~

可以看到此时多了一个备份文件

增量更新

$ cp -u a b	

此时的操作为,只有a比b更新或者b不存在的时候,才会进行更新,否则失败。

这个用法多用在:当横向对比两个文价夹有无重要更新的时候才会用到。

交互提示

$ cp -i b.txt a.txt
cp:是否覆盖"a.txt"

在文件存在的时候,-i选项会进行提示,此时需要输入y才能覆盖,而输入n就会取消这个操作。

探索网络连接的netstat

在Linux系统中,网络是至关重要的部分,而netstat命令是管理和监视网络连接的强大工具之一。

它提供了关于网络接口和路由表的详细信息,有助于了解网络连接状态、统计信息以及网络协议的使用情况。

也更方便我们对网络的管理、故障排除以及安全监控等等。

基本概述

netstat命令比较简单,通过简单的参数组合,可以获得各种网络相关的信息。

以下是一些常用的参数及其功能:

  • -a:显示所有连接和监听端口。
  • -t:仅显示TCP连接。
  • -u:仅显示UDP连接。
  • -n:以数字形式显示地址和端口号。
  • -p:显示进程标识符和程序名称。
  • -r:显示路由表。
  • -s:显示统计信息。

Linux nice命令

… note::

桃李春风一杯酒,江湖夜雨十年灯。

Linux nice命令可以通过修改优先级来执行程序,如果单纯输入nice,未指定程序,则会打印出目前的排程优先序,默认的数值为0,范围为最高优先级的 -20到 最低优先级的19。

所谓的优先序就是优先执行的概念,优先级越高,获得CPU的时间和顺序也会越提前。

官方定义为:

nice - run a program with modified scheduling priority

语法

使用方法如下:

$ nice [OPTION] [COMMAND [ARG]...]

参数的话,只有一个,如下:

  • -n, --adjustment=N 调整执行的优先序 (默认为 10)

实例

设置ls的优先级,如下将设置ls的优先级加10

$ nice ls

下面的就是把ls命令的优先级加5

$ nice -n 5 ls

设置程序运行时的优先级实例

下面通过几个操作来看一下nice的效果

$ vim &

$ nice vi

$ nice vim &

$ nice -n 5 vim &

# 查看进程状态 其中PRI即为优先级情况,可以看到几个进程是不同的。
$ ps -l 
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000     8     7  0  80   0 -  6406 -      tty1     00:00:02 bash
0 T  1000   251     8  0  75 42967291 - 15927 - tty1     00:00:00 vim
0 T  1000   319     8  0  65 42967281 - 15927 - tty1     00:00:00 vi
0 T  1000   374     8  0  65 42967281 - 15927 - tty1     00:00:00 vim
0 T  1000   415     8  2  70 42967286 - 15927 - tty1     00:00:00 vim
0 R  1000   456     8  0  80   0 -  4983 -      tty1     00:00:00 ps

不要告诉别人的passwd

passwd用于创建或者更新用户密码,是管理员必备的命令之一。

这个命令最终的实现是通过调用Linux-PAM 和Libuser API来实现的。

官方的定义为:

passwd - update user’s authentication tokens

使用的方法为:

$ passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

其中很常用的options为:

  • -S, --status:显示密码的状态信息
  • -d, --delete:删除用户密码,此时该用户将处于无密码状态

不太常用的options为:

  • --stdin:可以通过标准输入,亦可以为一个pipe
  • -l, --lock:锁定账号,不过也不是完全锁定,因为用户可以通过ssh key来继续访问
  • -u, --unlock:与上面的-l选项相反,属于解锁用户
  • -w, --warning DAYS:口令到期前通知用户,具备password lifetime的才支持

修改或更新密码

这个是最常用的用法,用于设置或者修改更新用户密码

$ sudo passwd user  		#设置用户user的密码
Enter new UNIX password:  	#输入新密码,输入的密码不显示
Retype new UNIX password:  	#再次输入确认密码
passwd: password updated successfully
# 此时设置成功

删除用户密码

$ sudo passwd -d user 
passwd: password expiry information changed.

此时用户处于无密码的状态,很类似最近说的,没有密码就是最安全的密码。

查看密码的状态

$ sudo passwd -S user
[sudo] password for oper: 
user PS 2013-02-11 0 99999 7 -1 (Password set, SHA512 crypt.)

说到密码,有两个比较重要的原则

  1. 保护好你的密码,不写下来而是记在脑海里,定时修改;
  2. 选择一个很难猜的密码,而不是最容易被攻破的top密码;

pgrep/pkill 检索终止当前正在运行的程序

鉴于用man pgrepman pkill的时候出来的同一个释义,所以要一次说两个命令了。

Linux pgreppkill 命令根据名称和其他属性来查找或发送处理的信号。

官方定义为:

pgrep, pkill - look up or signal processes based on name and other attributes

pgrep将查找当前运行的进程中满足条件的并打印到stdout中。

语法

语法如下所示:

$ pgrep [options] pattern
$ pkill [options] pattern

常用的参数为:

  • -u 选择仅匹配指定有效用户ID进程
  • -I 列出进程名及进程ID
  • -a 列出进程的详细命令行

默认无参数

默认情况下,仅仅列出包含关键词的进程ID。

$ pgrep ssh
3073
3833
4475
5786
5955
11301
13654
...

pkill刚好相反,直接发送终止信号(默认为SIGTERM)给这些进程。

指定用户

可以通过-u来指定用户

$ pgrep ssh -u username
4475
22084
27695
...

列出进程名

仅仅看到ID是崩溃的,因为不知道具体的进程,可以通过-l来查看进程名

$ pgrep ssh -l
3073 sshd
3833 ssh-agent
4475 ssh-agent
5786 ssh-agent
5955 sshd
...

更详细的进程信息

或许知道的进程名,还不足以了解具体信息,此时-a选项就爬上用场了。

$ pgrep ssh -a
3073 /usr/sbin/sshd -D
3833 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
5955 sshd: /usr/sbin/sshd -D -f /assets/sshd_config -e [listener] 0 of 100-200 startups
...

网络中不中,先看ping行不行

linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了。

官方定义为:

ping - send ICMP ECHO_REQUEST to network hosts

ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性。

ping使用ICMP传输协议,通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示返回的相应情况,根据这些信息就可以判断目标主机是否可以访问,在发送的过程中还会有一个时间戳用来计算网络的状态。

不过有些服务器为了防止通过ping探测到,可能会在防火墙或者内核参数中禁止ping命令,这样的话,可能虽然目标主机可以访问,但是无法ping通,所以并不能说ping不通的网络就是不能访问的。

需要注意linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。

语法

ping的使用说实话挺复杂,挺多的,不过常用的这篇短文基本就够了。

详细如下:

# ALL
$ ping  [-aAbBdDfhLnOqrRUvV46]  [-c  count]  [-F  flowlabel]  [-i  interval]  [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N node‐info_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination

# 较常用的选项如下:
$ ping   [-c  count]   [-i  interval]  destination

参数说明

  • -c <完成次数> 设置完成要求回应的次数。

  • -i interval 指定收发信息的间隔时间。

不加任何参数

如果不加任何参数,查看是否ping

$ ping www.baidu.com   
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=52 time=6.06 ms
64 bytes from 115.239.210.27: icmp_seq=2 ttl=52 time=5.56 ms
64 bytes from 115.239.210.27: icmp_seq=3 ttl=52 time=5.67 ms
64 bytes from 115.239.210.27: icmp_seq=4 ttl=52 time=5.82 ms
64 bytes from 115.239.210.27: icmp_seq=5 ttl=52 time=5.70 ms
64 bytes from 115.239.210.27: icmp_seq=6 ttl=52 time=5.79 ms  
^C # 此处输入了Ctrl+C强制退出
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.152/0.159/0.172/0.017 ms

可以看到可以ping通www.baidu.com,时延还算比较OK,几个毫秒量级。

这里看一下几个字段的含义,其中:

56(84) bytes of data:表示默认的数据包长度为56字节;

time=5.56ms:表示响应的时间,值越小,证明连接越快;

TTL=52:TTL是Time To Live的缩写,表示DNS记录在DNS服务器上存在的时间,是IP协议包的一个值,告诉路由器啥时候抛弃这个数据包,(大体上可以通过这个值来判断目标类型的操作系统。)

发送指定数目

可以通过 参数-c 来发送指定数目的包后停止

$ ping www.baidu.com -c 5
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=52 time=6.03 ms
64 bytes from 115.239.211.112: icmp_seq=2 ttl=52 time=5.96 ms
64 bytes from 115.239.211.112: icmp_seq=3 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=4 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=5 ttl=52 time=6.21 ms

5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 5.791/5.958/6.215/0.186 ms

此时将在发送5次数据包以后自动停止,在Linux里面,如果不加这个参数,是会一直发送运行的。

设定发送时间间隔

可以通过 参数 -i N指定每个N秒发送一次信息,如下将每隔3秒发送一次ping信息。

$ ping www.baidu.com -i 3
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=5 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=6 ttl=55 time=28.6 ms
^C
6 packets transmitted, 6 received, 0% packet loss, time 15041ms
rtt min/avg/max/mdev = 28.650/28.670/28.697/0.139 ms

如上,每隔3秒会发送一次,对于需要持续检测或者记录的可以考虑适当加大这个时间间隔。

注意,只有管理员可以设置小于0.2秒的时间间隔。所以这个数值可以是浮点数~

组合使用

上面的几个例子是可以配合使用的,比如

$ ping www.baidu.com -c 4 -i 5 
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=29.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=55 time=29.4 ms

5 packets transmitted, 5 received, 0% packet loss, time 20045ms
rtt min/avg/max/mdev = 29.396/29.428/29.461/0.110 ms

这个例子为:每个5秒查询一次,一共查询4次,然后退出。

pkill 终止当前正在运行的程序

参考 Linux pgrep 命令。—

Linux poweroff 命令

参考 Linux reboot 命令。—

显示进程状态 ps

ps命令是“process status”的缩写,类似于 windows 的任务管理器
ps命令用于显示当前系统的进程状态。
通常搭配kill指令随时中断、删除不必要的程序。

同时呢,ps命令是非常强大的进程查看命令,可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分【Windows】任务管理器的信息都是可以通过执行该命令得到的。

语法

$ ps [参数]

常用参数

  • -A 列出所有的行程
  • -w 显示加宽可以显示较多的资讯
  • -au显示较详细的资讯
  • -aux显示所有包含其他使用者的行程

其中aux的输出信息如下所示:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的内存使用率
  • VSZ: 占用的虚拟内存大小
  • RSS: 占用的内存大小
  • TTY: 终端的minor装置号码
  • STAT: 该行程的状态:
  • START: 行程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令

几个实例

默认情况

$ ps
  PID TTY          TIME CMD
44965 pts/0    00:00:00 bash
56519 pts/0    00:00:00 ps

什么参数都不跟的话,基本输出没啥用处。

显示所有进程

通常情况下,最常用的为把所有进程显示出来:

$ ps -aux
$ ps -A    

把所有进程显示出来,并输出到ps.txt文件:

$ ps -aux > ps.txt

查找特定进程信息

大部分情况下,希望查找有问题的进程或者感兴趣的进程,使用管道如下:

 $ ps -aux | grep ssh
 root       1303  0.0  0.0  82468  1204 ?        Ss   Apr17   0:00 /usr/sbin/sshd
 root       3260  0.0  0.0  52864   572 ?        Ss   Apr17   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
 root      24188  0.0  0.0 112652   956 pts/0    S+   11:39   0:00 grep --color=auto ssh

Linux pstree命令

Linux pstree命令是processes tree的简称,用于将所有的进行以树状图进行显示。

可以说是结合了pstree两个命令。

官方定义为:

pstree - display a tree of processes

使用方法为:

$ pstree [-a, --arguments] [-c, --compact-not] [-C, --color attr] [-g, --show-pgids] [-h, --highlight-all, -Hpid, --high‐light-pid pid] [-l, --long] [-n, --numeric-sort] [-N, --ns-sort ns] [-p, --show-pids] [-s, --show-parents] [-S, --ns-changes] [-t, --thread-names] [-T, --hide-threads] [-u, --uid-changes] [-Z, --security-context] [-A, --ascii, -G, --vt100, -U, --uni‐code] [pid, user]  

参数比较多,也比较复杂。其中常用的选项为:

  • -a 显示整个命令的完整路径。
  • -G 有时可以使用这个选项,输出好看一些。

实例 默认显示

默认显示当前的进程:

$ pstree   
systemd─┬─SIMU.EXE───STARTPMON
        ├─NetworkManager───2*[{NetworkManager}]
        ├─abrt-dbus───3*[{abrt-dbus}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─agetty
        ├─10*[at-spi-bus-laun─┬─dbus-daemon]
        │                     └─3*[{at-spi-bus-laun}]]
        ├─10*[at-spi2-registr───2*[{at-spi2-registr}]]
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─boltd───2*[{boltd}]
        ├─chrome─┬─2*[cat]
        │        ├─chrome───chrome─┬─chrome
        │        │                 └─5*[{chrome}]
        │        ├─chrome───8*[{chrome}]
        │        ├─chrome-sandbox───chrome─┬─chrome─┬─chrome───4*[{chrome}]
        │        │                         │        └─2*[chrome───12*[{chrome}]+
        │        │                         └─chrome-sandbox───nacl_helper
        │        └─21*[{chrome}]
        ├─chronyd
        ├─colord───2*[{colord}]
        ├─crashpad_handle───2*[{crashpad_handle}]
        ├─crond
        ├─cupsd
        ├─11*[dbus-daemon]
        ├─10*[dbus-launch]
        ├─10*[dconf-service───2*[{dconf-service}]]
        ├─dnsmasq───dnsmasq
...

显示完成路径

使用-a参数可以看到各个进程的详细信息

$ pstree -a
...
  |-at-spi-bus-laun
  |   |-dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
  |   `-3*[{at-spi-bus-laun}]
  |-at-spi-bus-laun
  |   |-dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
  |   `-3*[{at-spi-bus-laun}]
...

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所以pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx  1 root root   14 Jan 15 2012 dir -> source/dir
drwxrwxrwx  1 root root   14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

Linux reboot/poweroff/halt 命令

… note::

世事漫随流水,算来一梦浮生。

Linux halt, poweroff, reboot 用来挂起、关机或者重启机器,成功后返回0。

这不是一个命令,这是三个命令,只不过三个命令的参数都是一致的。

官方定义为:

halt, poweroff, reboot - Halt, power-off or reboot the machine

其实这三个命令都可以通过shutdown来执行,并且相对而言shutdown的参数还更多一些。

语法

使用方法如下:

$ halt [OPTIONS...]

$ poweroff [OPTIONS...]
    
$ reboot [OPTIONS...]

参数如下所示:

  • --halt 将机器挂起,三个命令均相同
  • -p, --poweroff 将机器关机,三个命令均相同
  • --reboot 将机器重启,三个命令均相同
  • -f, --force 立即执行挂起、关机和重启,一般对于force而言,除非万不得已,否则进来莫用
  • -n, --no-sync 在挂起、关机或重启前不对硬盘进行同步,这个很危险呀,进来不要用呀
  • --no-wall 在挂起、关机或重启前不发送警告信息,对于多用户不友好

立即关机

接下来的三个命令一致,都是将电脑关机,不过这个用法总归感觉怪怪的,所以还是分开各司其职比较好。比如关机还是poweroff,重启还是reboot吧。

$ halt --poweroff

$ poweroff --poweroff

$ reboot --poweroff

删除文件和目录命令rm

rm 命令用于删除文件或者目录。官方定义为:

remove files or directories

语法

$ rm [options] name...

参数

  • -i 删除前逐一询问确认,确认时比较好用。
  • -f 即使原档案属性设为唯读,也直接删除,无需逐一确认,是force的意思。
  • -r 将目录及里面的子文件逐一删除。

几个示例

删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:

$ rm  a.txt 
rm:是否删除 一般文件 "test.txt"? y  
$ rm  test  
rm: 无法删除目录"test": 是一个目录  
$ rm  -r  test  
rm:是否删除 目录 "test"? y 

删除当前目录下的所有文件及目录,命令行为:

$ rm  -r  * 

文件一旦通过rm命令删除,则无法恢复,所以必须格外一定切记小心地使用该命令。

因为发生过很多欲哭无泪的故事。。。

rmdir简介

rmdir 相对于 mkdirrmdir 是用来将一个“空的“目录删掉。

如果一个目录下面没有任何文件或文件夹,你就可以用 rmdir 指令将其除去。

而如果一个目录底下有其他的内容, rmdir 将无法将这个目录杀掉,除非使用那么就加上**-r** 选项就ok了。

这个命令比较鸡肋,基本都可以通过rm来搞定解决。

官方定义为:

remove directory

使用方法很简单,基本如下:

$ rmdir directory

如果说出彩的话,只有-p选项还可以说道说道。

详细的解释为:

Each directory argument is treated as a pathname of which all components will be removed, if they are empty, starting with the last most component.

如果在删除子目录以后,主目录也是空目录的话,则一并删除之。

用法如下:

$ rmdir -p directory	

其他的还是使用rm吧。

Linux rsync 命令

rsync也是远程(或本地)复制和同步文件最常用的命令。

scp类似。

官方定义为:

rsync - a fast, versatile, remote (and local) file-copyint tool

从定义看,比scp要强一些。

借助rsync命令,可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步。比如最常用的就是在两台Linux主机之间进行数据的备份。

语法

语法相对而言,比较简单,不过用法其实挺多的。

$ rsync [OPTION...] SRC... [DEST]

常用的参数为:

  • -v : 详细模式输出
  • -r : 递归拷贝数据,但是传输数据时不保留时间戳和权限
  • -a : 归档模式, 归档模式总是递归拷贝,而且保留符号链接、权限、属主、属组时间戳
  • -z : 压缩传输
  • -h : human-readable
  • --progress: 显示传输过程
  • --exclude=PATTERN 指定排除传输的文件模式
  • --include=PATTERN 指定需要传输的文件模式

无参数传输

默认情况下,传输一个文件不需要任何参数:

$ rsync user@192.168.100.123:~/dest_file dir/

命令执行后,会提示输入远程机器的密码,不过成功后不会显示任何信息,需要自行确认。

常用传输

所以默认情况下,会使用rv参数,不仅可以传输一个目录,也可以是文件:

$ rsync -rv user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
a
b
c

显示详细进度

对于小文件而言,没有问题,但是如果文件比较大,比如有几个GB,那么此时--progress参数就会比较有帮助:

$ rsync -rv --progress user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
30 files to consider
a  100%   278.25MB/s  0:02:00   (xfer#1, to-check=28/30)
b  100%   289.25MB/s  0:02:00   (xfer#1, to-check=27/30)
c  100%   277.45MB/s  0:02:00   (xfer#1, to-check=26/30)

会实时更新传输的进度。

此时对比scp,可以看到多了一些提示信息,比如会提示:

receiving file list … done
30 files to consider

另外,在实时更新的进度里面也有了一些多出来的信息。

不传输一些文件

比如做软件开发,不希望传输一些编译过程中产生的.o文件,测试的--exclude参数就很完美,如下:

$ rsync -rv --progress --exclude "*.o" user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
25 files to consider
a  100%   278.25MB/s  0:02:00   (xfer#1, to-check=28/30)
b  100%   289.25MB/s  0:02:00   (xfer#1, to-check=27/30)
c  100%   277.45MB/s  0:02:00   (xfer#1, to-check=26/30)

此时就看到,本来该传输30组的数据,去掉了部分.o文件。

Linux scp命令

linux scp命令主要用于远程复制传输文件。

官方定义为:

scp — secure copy (remote file copy program)

是安全拷贝的缩写,主要是因为scp使用了ssh的安全机制。

scp应该是接触Linux的第一个用于在2台以上的服务器上做数据传输的不二命选,当然,ftp除外了。

语法

语法看着挺复杂:

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

其实简化下来就是:

$ scp [options] file_source file_target 

差不多有20个参数,不过常用的有如下几个:

  • -p:保留原文件的修改时间,访问时间和访问权限。
  • -r: 递归复制整个目录。
  • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

无参数传输

默认情况下,传输一个文件不需要任何参数:

$ scp src_file user@192.168.100.123:~/dest_file
user@192.168.100.123's password:
src_file                     100%   44  20.0KB/s   00:00

命令执行后,会提示输入远程机器的密码,后面会显示传输成功的文件。

目录传输

而传输一个目录不加任何参数的话,会报错如下:

$ scp src_dir user@192.168.100.123:~/dest_dir
user@192.168.100.123's password:
src_dir: not a regular file

提示要传输的不是常规的文件,需要加上参数-r递归传输如下:

$ scp src_dir user@192.168.100.123:~/dest_dir
user@192.168.100.123's password:
a        100%   75    35.1KB/s   00:00    
b        100%   48KB  14.7MB/s   00:00    
c        100%  581   326.4KB/s   00:00    
d        100%   48KB  15.3MB/s   00:00 
e        100%   278MB 130.7MB/s  00:02

显示详细进度

对于小文件而言,没有问题,但是如果文件比较大,比如有几个GB,那么此时-v参数就会比较有帮助:

$ scp a user@192.168.100.123:~/b
user@192.168.100.123's password:
a        0%          0 0.0KMB/s  --:-- ETA
a        30%    110MB 130.7MB/s  00:02
a        100%   278MB 130.7MB/s  00:02

会实时更新传输的进度。

保持初始状态

加上-p参数就会保留文件的修改时间,访问时间和访问权限:

$ scp -p a user@192.168.100.123:~/b

这个对于有些对时间很有控制欲的人很有帮助。

所以最常用的用法是(文件和文件夹均适用):

$ scp -rvp filename/directory user@192.168.100.123:~/

sed command examples

When you copy a DOS file to Unix, you could find \r\n in the end of each line. This example converts the DOS file format to Unix file format using sed command.

$sed 's/.$//' filename

Print file content in reverse order

$ sed -n '1!G;h;$p' thegeekstuff.txt

Add line number for all non-empty-lines in a file

$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /'

More sed examples: Advanced Sed Substitution Examples
le

$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /'

More sed examples: Advanced Sed Substitution Examples

Linux shutdown 命令

… note::

青山依旧在,几度夕阳红。

Linux shutdown 命令可以用来挂起、关机或者重启设备,执行成功的话会返回0。

官方定义为:

shutdown - Halt, power-off or reboot the machine

语法

使用方法如下:

$ shutdown [OPTIONS...] [TIME] [WALL...]

第一个参数可能是一个时间字符串 (通常是 now),一般而言,后面可以跟上一个提示消息来通知登陆的用户系统马上进行的操作。

时间字符串的一般为hh:mm,表示经过多长时间进行关机,当然比较常用的为+m,也就是m分钟后执行操作。

参数如下所示:

  • -H, --halt 挂起机器
  • -P, --poweroff 关机(默认选项)
  • -r, --reboot 重启机器
  • -h 等效于–poweroff,出发专门指定 --halt选项
  • -k不进行挂起、关机或者重启,仅仅发送通知信息
  • --no-wall : 挂起、关机或者重启前,不发送信息
  • -c 取消当前正在进行的关机动作,前提是参数不是now

立即关机

$ shutdown -h now

十分钟后关机

$ shutdown -h 10

# 增加提示信息
$ shutdown -h 10 "The system will shutdown in 10 minutes, save your work immediately"

17:30关机

$ shutdown -h 17:30

# 增加提示信息
$ shutdown -h 10 "The system will shutdown in 17:30 , remember to save your work"

重新启动计算机

$ shutdown -r now

Linux 之 skill 命令

…note::
江山代有才人出,各领风骚数百年。
赵翼《论诗五首·其二》

Linux skill命令送个讯号给正在执行的程序,预设的讯息为 TERM (中断),较常使用的讯息为 HUPINTKILLSTOPCONT 和 0。

讯息有三种写法:分别为 -9、-SIGKILL、-KILL,可以使用 -l 或 -L 已列出可使用的讯息。

官方含义为:

skill, snice - send a signal or report process status

语法

$ skill [signal] [options] expression
$ snice [new priority] [options] expression

一般参数:

  • -i, --interactive :交互模式,每个动作将要被确认
  • -l, --list : 列出所有的信号
  • -L, --table : 列出所有的信号名

列出所有的信号

$ skill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

用漂亮的表格列出所有的信号

$ skill -L
 1 HUP      2 INT      3 QUIT     4 ILL      5 TRAP     6 ABRT     7 BUS
 8 FPE      9 KILL    10 USR1    11 SEGV    12 USR2    13 PIPE    14 ALRM
15 TERM    16 STKFLT  17 CHLD    18 CONT    19 STOP    20 TSTP    21 TTIN
22 TTOU    23 URG     24 XCPU    25 XFSZ    26 VTALRM  27 PROF    28 WINCH
29 POLL    30 PWR     31 SYS

kill掉用户users在PTY的进程

$ skill -KILL -t /dev/pts/*

停止三个使用者 user1、user2、user3

$ skill -STOP -u user1 -u user2 -u  user3

相关命令

  • :ref:kill<linux-beginner-kill>
  • :ref:killall<linux-beginner-killall>
  • :ref:nice<linux-beginner-nice>
  • :ref:pkill<linux-beginner-pkill>
  • :ref:renice<linux-beginner-renice>
  • :ref:signal<linux-beginner-signal>

OPTIONS

PROCESS SELECTION OPTIONS
Selection criteria can be: terminal, user, pid, command. The options below may be used to ensure correct interpretation.

   -t, --tty tty
          The next expression is a terminal (tty or pty).

   -u, --user user
          The next expression is a username.

   -p, --pid pid
          The next expression is a process ID number.

   -c, --command command
          The next expression is a command name.

   --ns pid
          Match the processes that belong to the same namespace as pid.

   --nslist ns,...
          list which namespaces will be considered for the --ns option.  Available namespaces: ipc,  mnt,  net,  pid,  user,
          uts.

SIGNALS
The behavior of signals is explained in signal(7) manual page.

EXAMPLES
snice -c seti -c crack +7
Slow down seti and crack commands.

休息一会 sleep

… note::
莫听穿林打叶声,何妨吟啸且徐行。
苏轼

Linux sleep命令可以用来将目前动作延迟一段时间。

sleep的官方定义为:

sleep - delay for a specified amount of time

或许你觉得计算机太累,让它稍事休息,亦或许过个个把钟头需要喝杯水,此时sleep就有点小作用了。

其用法如下:

$ sleep [--help] [--version] number[smhd]

除了帮助和版本信息,基本没有参数了。

其中的number是必须的,也就是sleep多久的数字,默认为s秒。其他的几个含义为:

  • s second 秒
  • m minute分钟
  • h hour 小时
  • d day 天

休息5分钟

工作太累了,学习太累了,躺着太累了,休息5分钟

$ sleep 5m

1小时后提醒我

$ sleep 1h

时分秒搭配使用

当然,sleep也是支持时分秒搭配使用的,如下所示:

$ sleep 1h 2m 3s

将会sleep 1个小时2分钟3秒。

倒计时计时器

当然也可以做个循环计时器,通过sleep 1

$ echo "five"   && sleep 1 && echo "four"   && sleep 1 && sleep 1 && echo "three"   && sleep 1 && echo "two" && sleep 1 && echo "one" && echo "Stop"

结合脚本

sleep在程序里面使用比较频繁,特别是单片机的走马灯等。而Linux的sleep,也是比较常与bash脚本来配合使用,如下:

#!/bin/bash
echo -e "start to sleep 15 seconds......"
sleep 15
echo -e "continue to run program......"
./program

Linux的 sort 命令

Linux sort 命令用于将文本内容进行排序。

官方定义为:

sort - sort lines of text files

语法

$ sort [OPTION]... [FILE]...
$ sort [OPTION]... --files0-from=F

常用的参数为

  • -c 检查文件是否已经按照顺序排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -r 以相反的顺序来排序。
  • -k field1[,field2] 按指定的列进行排序。

这里假定测试文件名为testfile

LiSi            80

ZhangSan        70

WangWu          90

MaLiu           88

默认无参数

在使用 sort 命令以默认的式对文件的行进行排序,命令如下:

$ sort testfile 



LiSi            80
MaLiu           88
WangWu          90
ZhangSan        70

sort 命令默认情况下将第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

根据第N列排序

对于测试文件而言,或许我们更希望使用数字来统计排序,此时可以使用-k N参数,其中N为列数

$  sort testfile -k 2



ZhangSan        70
LiSi            80
MaLiu           88
WangWu          90

检查是否已经排序

在某些情况下,或许只想看看文件是否已经排序,使用-c参数 :

$  sort -c testfile
sort: testfile:2: disorder

如果没有排序会有输出,而排序的话就没有输出。

逆序排列

如果希望看一下数字从高到低的培训,使用-r参数:

$  sort testfile -k 2  -r
WangWu          90
MaLiu           88
LiSi            80
ZhangSan        70



9. sort command examples

Sort a file in ascending order

$ sort names.txt

Sort a file in descending order

$ sort -r names.txt

Sort passwd file by 3rd field.

$ sort -t: -k 3n /etc/passwd | more

从指定文件中读取和执行命令的source命令

… note::
去年今日此门中,人面桃花相映红。
崔护《题都城南庄》

在 shell 中执行程序时,shell 会提供一组环境变量。source命令是shell的内建指定,用的最多的还是配置参数的读取和设置。

source命令的功能是用于从指定文件中读取和执行命令,通常用于被修改过的文件,使之新参数能够立即生效,而不必重启整台服务器。

较常与export等结合使用。export 可以新增,修改或删除环境变量,供后续执行的程序使用。不过export 在终端退出后就失效了。

如果需要一直有效,可以考虑写入配置文件。

类似阅后即焚的export命令

Linux export 命令用于设置或显示环境变量。比如如下所示:

$ export MYNAME='HELLOWORLD'

$ echo $MYNAME
HELLOWORLD

不过在终端退出后,这个变量定义就不复存在了。

登陆即可使用的source指令

source的用法一般如下所示:

$ source filename

比如最常用的:

$ source ~/.bash_profile

而对于第一个的设置,可以考虑将export MYNAME='HELLOWORLD'写入文件~/.bash_profile,这样每次登陆或者打开终端的时候都会自动载入了。

split - 精准划分

Linux split命令用于将一个文件切分开,一般用于将大文件切分为多个小文件,方便数据传输、保持和校验等。

默认情况下将按照每1000行切割成一个小文件。

官方定义为:

split - split a file into pieces

使用方法为:

$ split [OPTION]... [INPUT [PREFIX]]

常用的参数为:

  • -b, --bytes=SIZE : 指定每多少字节切成一个小文件

默认无参数

默认情况下,split 会将原来的大文件aa 切割成多个以x开头的小文件,可以看到其实为xaa,xab,一致到xaz,递增为xba以此类推。

$ split aa
$ ls 
-rw-rw-r-- 1 user user 611037792 Jan 15 22:09 aa
-rw-rw-r-- 1 user user    356533 Jan 15 22:10 xaa
-rw-rw-r-- 1 user user    377414 Jan 15 22:10 xab
-rw-rw-r-- 1 user user    346342 Jan 15 22:10 xac
-rw-rw-r-- 1 user user    358728 Jan 15 22:10 xad
-rw-rw-r-- 1 user user    391466 Jan 15 22:10 xae
-rw-rw-r-- 1 user user    368786 Jan 15 22:10 xaf
-rw-rw-r-- 1 user user    377274 Jan 15 22:10 xag
-rw-rw-r-- 1 user user    393500 Jan 15 22:10 xah
-rw-rw-r-- 1 user user    362512 Jan 15 22:10 xai
-rw-rw-r-- 1 user user    365170 Jan 15 22:10 xaj
-rw-rw-r-- 1 user user    362878 Jan 15 22:10 xak
-rw-rw-r-- 1 user user    387394 Jan 15 22:10 xal
-rw-rw-r-- 1 user user    355614 Jan 15 22:10 xam
-rw-rw-r-- 1 user user    366420 Jan 15 22:10 xan
-rw-rw-r-- 1 user user    368912 Jan 15 22:10 xao
-rw-rw-r-- 1 user user    350226 Jan 15 22:10 xap
-rw-rw-r-- 1 user user    386102 Jan 15 22:10 xaq
-rw-rw-r-- 1 user user    377292 Jan 15 22:10 xar
-rw-rw-r-- 1 user user    376416 Jan 15 22:10 xas
-rw-rw-r-- 1 user user    347584 Jan 15 22:10 xat
-rw-rw-r-- 1 user user    376586 Jan 15 22:10 xau
-rw-rw-r-- 1 user user    352778 Jan 15 22:10 xav
-rw-rw-r-- 1 user user    380608 Jan 15 22:10 xaw
-rw-rw-r-- 1 user user    356634 Jan 15 22:10 xax
-rw-rw-r-- 1 user user    377414 Jan 15 22:10 xay
-rw-rw-r-- 1 user user    346342 Jan 15 22:10 xaz

切分为1MB的文件

可以使用-b参数,切分为准确字节的文件,如下:

$ split aa -b 1024000
$ ll
-rw-rw-r-- 1 user user 611037792 Jan 15 22:09 aa
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xaa
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xab
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xac
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xad
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xae
-rw-rw-r-- 1 user user   1024000 Jan 15 22:15 xaf

指定前缀

这个参数直接跟在输入的文件后面即可,如下:

$ split aa DAT
$ ls
aa
DATaa
DATab
DATac
DATad
DATae
DATaf

```---



# ssh - 远程登陆

`ssh`命令是**openssh**套件中的客户端连接工具,使用加密协议实现安全的远程登录服务器,实现对服务器的远程管理。



官方定义为:

> ssh — OpenSSH remote login client



使用方法为:

```bash
$ ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
         [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address]
         [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
         [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]

看着很复杂,确实也很复杂。

不过常用的参数倒是不多,基本为:

  • -l login_name 指定连接远程服务器的登录用户名
  • -p port 指定远程服务器上的端口

登陆远程服务器

默认情况下,ssh直接跟上IP就可以,不过此时的登陆账户为本机的账户名,可以通过whoami得到,所以能登陆的前提是localname与服务器的username是一致的。

$ ssh 192.168.1.123
localname@192.168.1.123's password:

此时输入密码即可登陆。

指定用户名

大部分情况下,除非自己是管理员,可能远程登录名与本机名均不一致,此时需要指定登录名,参数-l即可搞定

$ ssh 192.168.1.123 -l username
username@192.168.1.123's password:

此时输入密码即可登陆。

多数情况的登陆方式

我最初使用的当然就是这种方式了,username@IP地址。

$ ssh username@192.168.1.123
username@192.168.1.123's password:
Last login: Thu Jan 24 19:14:48 2013 from 192.168.111

查看服务器的时间

有些时候可能登陆到服务器仅仅希望执行一些命令,比如看看服务器的时间是正确,服务器的负载如何,服务器的用户谁正在使用,此时可以在最后直接跟上命令,如下,单纯地看看服务器的时间:

$ ssh username@192.168.1.123 date
username@192.168.1.123's password:
Thu Jan 24 21:14:48 2013

指定端口

还有一些服务器登陆是开放的并不是默认的22端口,有可能是12345端口,此时就需要指定该端口进行登陆,如下:

$ ssh username@192.168.1.123 -p 12345
username@192.168.1.123's password:

4. ssh command examples

Login to remote host

ssh -l jsmith remotehost.example.com

Debug ssh client

ssh -v -l jsmith remotehost.example.com

Display ssh client version

$ ssh -V
OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003

More ssh examples: 5 Basic Linux SSH Client Commands

Linux 的 stat 命令

Linux stat 命令用于显示 inode 内容。

话说这个inode是个什么东西呢?对于存储在硬盘上的文件,特别是Linux的概念就是,一切皆文件。其最小的存储单元为512字节即一个扇区sector;在读取文件的时候,为了提高效率,是按照4KB的块block来读取的,所以这样看来每次读取了8个sector。而对于每个文件为了索引,其元数据的各种信息就是stat获取的,用于描述创建者、文件的各种日期、大小等等等等信息,这个元数据的id就可以认为是inode了,以上。

官方的定义为:

stat - display file or file system status

用法为:

$ stat [options] filename/directory

其中的参数为:

  • -L, --dereference : 不显示链接的原始文件

  • -f, --file-system :显示文件系统状态

  • --printf=FORMAT : 与C语言的类似,不过看着转义符更多一些

  • -t, --terse:超级简介的模式

最简单的使用

最简单的其实也是最有用的,直接跟上文件或者目录,如下:

$ stat text.txt 
  File: ‘text.txt’
  Size: 51        	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 1610934260  Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-11 21:24:49.660510438 +0800
Modify: 2012-09-09 17:31:54.518005296 +0800
Change: 2012-09-09 17:33:09.670327180 +0800
 Birth: -
 
 $ stat dir
  File: ‘dir’
  Size: 51        	Blocks: 0          IO Block: 4096   directory
Device: fd00h/64768d	Inode: 1610934255  Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-13 16:44:56.802331727 +0800
Modify: 2012-09-13 16:44:55.624342864 +0800
Change: 2012-09-13 16:44:55.624342864 +0800
 Birth: -

各个段的解释为:

  • File:文件或文件夹名
  • Size:文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)或者directory文件夹
  • Device:设备的编号
  • Inode:Inode号
  • Links:链接数
  • Access:文件的权限
  • Gid, Uid:文件所有者的Gid和Uid
  • Access:文件的访问时间
  • Modify:文件的修改时间
  • Change:文件的状态时间

显示文件系统

参数-f将显示文件系统信息,可以看到Type:xfs这个信息。

$ stat -f text.txt 
  File: "text.txt"
    ID: fd0000000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 244020823  Free: 182831648  Available: 182831648
Inodes: Total: 488280064  Free: 487587798

关于printf的那些格式化字符串

--printf=FORMAT选项可以跟的FORMAT有很多,较常用为:

格式化字符串含义
%A易读的访问状态
%B每个块的大小(单位为字节)
%d十进制的设备号
%F文件类型
%G所有者的组名
%iinode数字
%m挂载点
%n文件名
%s总大小(单位:字节)
%U所有者的用户名
%w易读的文件生成时间(大写的为Epoch)
%x易读的文件访问时间(大写的为Epoch)
%y易读的文件修改时间(大写的为Epoch)
%z易读的文件上一次修改状态时间(大写的为Epoch)

炫技 : 一个类似ls -l的用法

下面的这个命令可以实现类似ls -l的用法,可以扩展更多,也可以自定义使用,比如alias等等。

$ stat --print="%A. %U %G %s %x %n \n" text.txt 
-rw-rw-r--. user user 51 2012-09-11 21:24:49.660510438 +0800 text.txt

su 切换账号

su - user 能切换到一个用户中去执行一个指令或脚本

命令格式

该命令格式如下所示:

$ su [options...] [-] [user [args...]]

其中一些比较重要的选项如下所示:

  • -f –fast:快速启动,不读取启动文件,这个取决于具体的shell。
  • -l–login:这个参数让你有焕然一新的感觉,基本类似于重新登录。如果不指定,默认情况下是root环境。
  • -g--group:指定主要组,这个只能由root用户指定。
  • -m-p–preserve-environment:保留环境变量,除非指定了-l。
  • -s SHELL--shell=SHELL:切换使用的SHELL。

切换到用于user执行命令command

执行如下命令,会切换到user用户,然后执行ls命令

$ su - user -c ls

切换使用的SHELL

不同的人,可能对不同的SHELL情有独钟,A喜欢bash,B可能喜欢csh,这个就可以通过-s来切换,如下可以切换到csh

$ su - user -s /bin/csh

关于SHELL,根据安装的环境不同,基本有如下几个:

  • /bin/bash
  • /bin/tcsh
  • /usr/bin/sh
  • /bin/csh
  • /sbin/nologin
  • /bin/sh

su [user] 和 su - [user]的区别:

su [user]切换到其他用户,但是不切换环境变量,su - [user]则是完整的切换到新的用户环境。

如:

$ pwd
/root

$ su oper 
$ pwd  
/root


$ su - oper 
Password:
$ pwd
/home/oper

所以大家在切换用户时,尽量用su - [user],否则可能会出现环境变量不对的问题。

超凡脱俗的 sudo

超凡脱俗的 sudo

任务管理器的 top

任务管理器的 top

反向显示之 tac

… note::
未老莫还乡,还乡须断肠。
宋 韦庄《菩萨蛮 人人尽说江南好》

tac命令将文件反向输出,刚好与前面的cat输出相反,cat命令可用于输出文件的内容到标准输出。

这个命令其实就是cat的反向输出,😁。

tac的官方定义为:

tac - concatenate and print files in reverse

其用法一般为:

$ tac [OPTION]... [FILE]...

tac命令的可选参数[OPTION]如下所示:

  • -b, --before :在行前而不是行尾添加分割标志
  • -r, --regex:将分割标志作为正则表达式来解析
  • -s, --separator=STRING:使用STRING作为分割标志

同样使用前面的hello.c文件,内容为:

#include <stdio.h>

int main(int argc, char * argv[])
{
    printf("Hello World\n");
    
    return 0;
}

接下来的实例全部根据这个文件展开,Hello World. Hello Linux

显示内容

与cat比对输出如下所示:

$ cat hello.c 
#include <stdio.h>

int main(int argc, char * argv[])
{
    printf("Hello World\n");

    return 0;
}

$ tac hello.c
}
    return 0;

    printf("Hello World\n");
{
int main(int argc, char * argv[])

#include <stdio.h>

其他几个参数用的到时不多,不过搭配起来还是有一些帮助的,比如做一个反序输出,搭配使用-s-r参数,如下:

$ cat 'Hello World.' | tac -r -s "."
.dlroW olleH

这个方法就用到了管道、正则表达式。

不可狗尾续貂的tail

tail命令用来查看文件尾部的n行,如果没有指定的n,默认显示10行。

命令格式:

$ tail [option] [filename]  

参数option比较常用的如下所示:

  • -f 循环读取
  • -c <数目> 显示的字节数
  • -n <行数> 显示文件的尾部 n 行内容

常规使用

假定文件text.txt有20行,从1-20,默认情况下的使用如下:

$ tail text.txt
11
12
13
14
15
16
17
18
19
20

显示N行

可以通过-n参数来只显示N行,而不是默认的10行,比如15行,如下:

$ tail -n 15 text.txt
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从第N行显示

此时如果希望从第N行显示,而不是显示N行,可以通过下面的参数,比如从第15行显示

$ tail -n +15 text.txt
15
16
17
18
19
20

按照字符显示

如果希望显示文件的最后几个字符,比如6个,如下:

$ tail -c 6 text.txt
19
20

# NICE
# 查看文件的后60KB
$ tail -c 60k filename
# 查看文件的后60MB
$ tail -c 60m filename

特别赞的一个实时更新的功能

参数 -f 常常用于查阅正在改变的日志文件。如下面👇所示:

$ tail -f filename

如果filename的内容在增加,那么显示在屏幕上的内容就会一直更新。

解压方法之一 tar

… note::
十年磨一剑,霜刃未曾试。
贾岛《剑客 / 述剑》

Linux的tar命令可以用来压缩或者解压缩文件。

官方定义为:

tar - an archiving utility

语法

$ tar optionA [optionsB] filename

使用该命令时,optionA选项是必须要有的,它告诉tar要做什么事情,optionsB选项是辅助使用的,可以选用。

其中optionsA主要为:

  • -c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。
  • -x 从档案文件中释放文件。相当于拆包。
  • -t 列出档案文件的内容,查看已经备份了哪些文件。

不过需要注意的是,这三个参数仅仅能存在一个。

辅助选项常用的为:

  • -z :是否同时具有 gzip 的属性,有的话压缩文件格式为:filename.tar.gz
  • -j :是否同时具有 bzip2 的属性,有的话压缩文件格式为:filename.tar.bz2
  • -v :压缩的过程中显示文件,这个基本都需要带上
  • -p :使用原文件的原来属性(属性不会依据使用者而变)
  • --exclude FILE:在压缩的过程中,不要将 FILE 打包!

压缩文件

接下来的命令为把a,b,c,d压缩到文件test.tar.gz中。

$ tar czvf test.tar.gz a b c d
a
b
c
d

查看压缩文件的内容

接下来的命令将列出压缩文件的内容,但是不解压,所以可以先确定,再解压不迟

$ tar tzvf test.tar.gz a b c d
-rw-rw-r-- oper/oper           12 2010-05-24 22:51 a
-rw-rw-r-- oper/oper           18 2010-05-24 22:51 b
-rw-rw-r-- oper/oper           15 2010-05-24 22:51 c
-rw-rw-r-- oper/oper           28 2010-05-24 22:51 d

解压文件

接下来就可以解压操作了。

$ tar zxvf test.tar.gz
a
b
c
d

创建、修改、更新文件的touch

linuxtcpdump命令不常用,一般用来修改文件时间戳(可更改文件或目录的日期时间,包括存取时间和更改时间)或者新建一个不存在的文件。

命令格式

$ touch [选项]... 文件...

其中选项如下所示:

  • -a 只更改存取时间。
  • -c 或–no-create  不建立任何文档。
  • -d  使用指定的日期时间,而非现在的时间。
  • -m 只更改变动时间。
  • -r  把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同。
  • -t  使用指定的日期时间,而非现在的时间。

创建不存在的文件

$ ls

$ touch a.txt b.txt

$ ls
a.txt b.txt

更新b.txt 的时间和 a.txt 时间戳相同

# 将文件b.txt的时间戳与a.txt保持一致
$ touch -r a.txt b.txt

设定文件的时间戳

# 设定filename的时间戳为2012年05月06日13时14分15秒
$ touch -t 201205061314.15 filename

$ ls -l
-rw-rw-r--. 1 user user 0 May  6  2012 filename

其中-t time 使用指定的时间值 time 作为指定文件相应时间戳记的新值.此处的 time的形式如下为: [[CC]YY]MMDDhhmm[.SS]

其中秒及年可以省略。

Linux的 tee 命令

Linux的tee命令可以将输出输出到终端的同时写入文件。

这个命令对于既想试试看到输出保存到文件稍后查看的操作十分有用。

官方定义为:

tee - read from standard input and write to standard output and files

语法

具体的使用方法为:

  $ tee [OPTION]... [FILE]...

参数

  • -a, --append  追加到现有文件的后面,而非覆盖它.
  • -i, --ignore-interrupts  忽略中断信号。

一般使用

比如最简单的想查看一下当前有哪些文件并保存到一个日志,如下:

$ ls
a.txt b.txt c.txt d.txt e.txt

$ ls | tee list.log
a.txt b.txt c.txt d.txt e.txt

$ cat list.log
a.txt b.txt c.txt d.txt e.txt

可以看到tee在保证同时显示在终端上还输出到了文件 list.log中。

同时保存到多个文件

tee当然也是可以同时输出到多个文件的,比如:

$ ls
a.txt b.txt c.txt d.txt e.txt

$ ls | tee list.log listB.log
a.txt b.txt c.txt d.txt e.txt

$ cat list.log
a.txt b.txt c.txt d.txt e.txt
$ cat listB.log
a.txt b.txt c.txt d.txt e.txt

与自己对话

与自己对话如何呢,或者叫做复读机?

tee命令直接跟文件的话,会等待输入,并同步进行输出到终端和文件的操作。

$ tee test.log 
hello
hello
world
world

$ cat test.log
hello
world

时光总是催人老 time

… note::

林花谢了春红,太匆匆。无奈朝来寒雨晚来风。

Linux time命令的用途,在于测量指定命令消耗的时间。

最常用的在于大概评估一个程序的运行时间。

这个命令很容易给人的印象是与date混淆起来

官方定义为:

time - time a simple command or give resource usage

可以给出包括系统的粗略时间。

语法

$ time [options] command [arguments...]

参数

​ - 可以认为没有参数

示例

会显示程序或命令执行的消耗时间

$ time ls /var
account  crash  games     lib    log  ......

real    0m0.014s
user    0m0.003s
sys     0m0.010s


$ time ps -aux
root     295490  0.0  0.0      0     0 ?        S    Feb20   0:10 [ldlm_cb00_019
root     297717  0.0  0.0      0     0 ?        S<   Jan29   0:04 [kworker/58:1H
root     304801  0.0  0.0      0     0 ?        S    Mar19   0:00 [kworker/1:1]
root     311110  0.0  0.0      0     0 ?        S    Mar20   0:00 [kworker/66:0]
root     313146  0.0  0.0      0     0 ?        S    Mar20   0:01 [kworker/73:2]
root     313461  0.0  0.0      0     0 ?        S<   Jan29   0:00 [kworker/44:2H
root     313914  0.0  0.0      0     0 ?        S    Feb21   0:10 [kworker/9:2]
root     314118  0.0  0.0      0     0 ?        S    Feb21   3:34 [kworker/18:1]
root     315801  0.0  0.0      0     0 ?        S    Mar20   0:00 [kworker/79:2]

real    0m0.180s
user    0m0.019s
sys     0m0.114

唯一需要留意的是上面的三个含义:

  1. real : 程序从开始调用到最后终止之间经过的实时时间
  2. user : 程序本身,以及它所调用的库中的子例程使用的CPU 时间
  3. sys : 程序直接或间接调用的系统调用执行的CPU 时间

任务管理器的 top

top命令比较像Windows里面的任务管理器,提供一个动态实时的系统状态检测,可以检测实时显示内存、CPU、进程的运行状态,主要在分析系统负载的时候比较常用。

官方定义为:

top - display Linux processes

状态默认实时显示,间隔为1秒。

使用的方法如下(选项超级多,其实不复杂):

$ top -bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]

参数说明

  • -d : 改变显示的更新速度,或是在交互式( interactive command)按 sd
  • -c : 切换显示模式,共有两种模式,一是只显示执行程序的名称,另一种是显示完整的路径与名称;这个在定位执行命令的时候较常用
  • -n : 更新的次数,完成后将会退出
  • -b : 批模式操作,主要用来将 top 的结果输出到其他程序或者文件;
  • -i : 不显示任何闲置不使用CPU的进程
  • -s : 安全模式,取消交谈式指令
  • -pN1 -pN2 ... or -pN1,N2,N3 ...:指定PID模式,仅仅监控N1,N2等信息
  • -u/U user:仅仅关注user的进程情况

常规使用

在输入top命令以后,如果希望退出,可以数据q或者直接Ctrl+c即可。

还有一个情况,可以输入h进行帮助查询,用于进一步的交互操作。

通常情况下,最常用的就是输入top命令,不加任何参数,这种情况下最希望看到的就是最占用系统资源的进程。

如下所示:

$ top

top - 22:23:20 up 461 days,  7:52, 18 users,  load average: 1.82, 1.57, 1.45
Tasks: 773 total,   1 running, 768 sleeping,   0 stopped,   4 zombie
%Cpu(s): 10.1 us,  6.5 sy,  0.0 ni, 83.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 32664832 total,   668020 free, 15683576 used, 16313236 buff/cache
KiB Swap: 16449532 total, 13409776 free,  3039756 used. 15787188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                               
 7965 dbus      20   0   76092   8456   1704 S   7.5  0.0  40307:04 dbus-daemon                                                                                                                  
23460 root      20   0  397640   5560   3248 S   4.2  0.0   4738:26 accounts-daemon                                                                       
 4321 user       20   0  821828 104812   4584 S   3.2  0.3   7380:28 gsd-color                                    

此时可以看到系统的基本信息,可以看到分为三个部分:

  1. 汇总信息:可以看到系统的运行状态,总的负载信息,运行总的任务,登陆的用户,CPU及内存的状态等等。
  2. Fields/Columns 头信息:用来标记接下来所有进程对应的信息
  3. Task 区域:每个运行程序的各种信息,在Fields/Columns有对应的,比如PID、用户、占用CPU、MEM及对应的命令等等。

显示完整命令

$ top -c

7965 dbus      20   0   76092   8456   1704 S   7.5  0.0  40307:04 /usr/bin/dbus-daemon  

此时省去其他信息,可以看到dbus-daemon增加了路径信息为**/usr/bin/dbus-daemon**

设置信息更新次数

这个命令用于定量显示,比如刷新10次后退出,如下:

$ top -n 10

设置信息更新时间

如果觉得太长或者太短,可以通过-d来设置,或者在交互模式下输入d或者s来设置。

$ top -d 0.8 # 设置为0.8秒

$ top -d 6 # 设置为6秒

显示指定的进程信息

如果仅仅对某个进程感兴趣,如下指定PID即可。

$ top -p 1234 # 对进程1234感兴趣

指定用户的进程信息

作为管理员or朋友,或许对某个用户感兴趣,比如user,此时可以仅仅显示该用户的进程信息

$ top -u user

创建、修改、更新文件的touch

linuxtouch命令不常用,一般用来修改文件时间戳(可更改文件或目录的日期时间,包括存取时间和更改时间)或者新建一个不存在的文件。

命令格式

$ touch [选项]... 文件...

其中选项如下所示:

  • -a 只更改存取时间。
  • -c 或–no-create  不建立任何文档。
  • -d  使用指定的日期时间,而非现在的时间。
  • -m 只更改变动时间。
  • -r  把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同。
  • -t  使用指定的日期时间,而非现在的时间。

创建不存在的文件

$ ls

$ touch a.txt b.txt

$ ls
a.txt b.txt

更新b.txt 的时间和 a.txt 时间戳相同

# 将文件b.txt的时间戳与a.txt保持一致
$ touch -r a.txt b.txt

设定文件的时间戳

# 设定filename的时间戳为2012年05月06日13时14分15秒
$ touch -t 201205061314.15 filename

$ ls -l
-rw-rw-r--. 1 user user 0 May  6  2012 filename

其中-t time 使用指定的时间值 time 作为指定文件相应时间戳记的新值.此处的 time的形式如下为: [[CC]YY]MMDDhhmm[.SS]

其中秒及年可以省略。

tr 转换或删除字符

Linux tr 命令用于转换或删除字符。

tr 命令可以从标准输入读取数据,经过字符串转译后,将结果输出到标准输出。

官方定义为:

tr - translate or delete characters

使用方法为:

$ tr [OPTION]... SET1 [SET2]

其中常用的三个选项为:

  • -d, --delete:删除指令字符
  • [:lower:] :所有小写字母
  • [:upper:] :所有大写字母
  • [:blank:] :所有空格

a-z小写全部转换为大写

默认无参数的显示

$ echo "Hello World, Welcome to Linux!" | tr a-z A-Z
HELLO WORLD, WELCOME TO LINUX!

# 还有一种方法
$ echo "Hello World, Welcome to Linux!" | tr [:lower:] [:upper:]
HELLO WORLD!

A-Z大写全部转换为小写

默认无参数的显示

$ echo "Hello World, Welcome to Linux!" | tr  A-Z a-z
hello world, welcome to linux!

# 还有一种方法
$ echo "Hello World, Welcome to Linux!" | tr [:upper:] [:lower:]
hello world, welcome to linux!

貌似起名可以用这个

很多变量或者函数起名字都会移除元音字符,可以考虑使用-d参数,如下:

$ echo "Hello World, Welcome to Linux!" | tr -d a,o,e,i
Hll Wrld Wlcm t Lnux!

移除空格

同理,使用-d,结合[:blank:]可以快速删除所有空格。

$ echo "Hello World, Welcome to Linux!" | tr -d [:blank:]
HelloWorld,WelcometoLinux!

Linux的tracepath命令

tracepath用于显示报文到达某一个地址的路由信息,能够发现其中的MTU信息。

在探测过程中,会使用UDP端口或随机端口。所以可以看到后面的?符号。与traceroute类似。

这对于长距离的数据传输分析有很明显的帮助作用。

官方的定义为:

tracepath, tracepath6 - traces path to a network host discovering MTU along this path

使用方法为:

$ tracepath [-n] [-b] [-l pktlen] [-m max_hops] [-p port] destination

其中选项如下所示:

  • -n:只显示IP地址信息(默认是显示域名的,这个选项将不显示域名了)
  • -b:同时显示主机名和IP地址(默认没有域名的只显示IP地址,这个选项即使没有主机名也会把IP地址作为主机名)
  • -l:设置初始化的数据包长度,默认tracepath为65535,而tracepaht6为128000
  • -m:设置最大的hops(或最大的TTL)为max_hops(默认为30)
  • -p:设置初始使用的目标端口

官网的一个例子及含义

root@mops:~ $ tracepath6 3ffe:2400:0:109::2
1?: [LOCALHOST]                      pmtu 1500
1:  dust.inr.ac.ru                   0.411ms
2:  dust.inr.ac.ru        asymm  1   0.390ms pmtu 1480
2:  3ffe:2400:0:109::2               463.514ms reached
    Resume: pmtu 1480 hops 2 back 2

以其中一行为例:

TTL探测信息
1?:[LOCALHOST] pmtu 1500
1:dust.inr.ac.ru 0.411ms
这一列显示探测的TTL,用分号来分割。
不过有些情况下信息不足以确认,就出现了猜测的?
显示网络探测信息:
如果未发送到网络,则为路由器地址或者localhost地址;
这里还会显示MTU、延迟等等等。

最后一行会总结整个链路的状态信息,显示了检测到的路径MTU、到达目的地的hops以及从目的地返回的hops数。

可以与ping配合使用,可以先用ping获取到具体的IP地址,然后使用tracepath进行进一步的分析。

$  ping www.bing.com
PING china.bing123.com (202.89.233.101) 56(84) bytes of data.
64 bytes from 202.89.233.101 (202.89.233.101): icmp_seq=1 ttl=116 time=28.1 ms
64 bytes from 202.89.233.101 (202.89.233.101): icmp_seq=2 ttl=116 time=27.9 ms
^C
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 27.964/28.072/28.181/0.199 ms
$ tracepath 202.89.233.101
 1?: [LOCALHOST]                                         pmtu 1500
 1:  no reply
 2:  202.127.24.1                                          2.859ms
 ...
```---

# Linux的traceroute命令


..note::
 少小离家老大回,乡音无改鬓毛衰。
 贺知章《回乡偶书二首·其一》

Linux `traceroute`命令用于打印显示数据包到网络主机的路径。

`traceroute`会跟踪从**IP**网络发送到指定主机的路由包,并利用IP协议的生存时间(**TTL**)字段,试图在通往主机路径上的每个网关得到一个ICMP TIME_EXCEEDED响应,由此可得具体的路由信息。

官方的定义为:

>  traceroute - print the route packets trace to network host



## 语法

使用方法还挺复杂的,不过常用的不多:

```bash
$ traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
               [-i device] [-m max_ttl] [-p port] [-s src_addr]
               [-q nqueries] [-N squeries] [-t tos]
               [-l flow_label] [-w waittimes] [-z sendwait] [-UL] [-D]
               [-P proto] [--sport=port] [-M method] [-O mod_options]
               [--mtu] [--back]
               host [packet_len]

最简单的一个实例

显示到达目的地的数据包路由

$ traceroute www.bing.com
traceroute to www.bing.com (202.89.233.101), 30 hops max, 60 byte packets
 1  * * *
 2  10.12.24.1 (202.127.24.1)  3.487 ms  3.490 ms  4.484 ms
 3  * * *
 4  192.168.1.53 (192.168.1.53)  4.437 ms  4.435 ms  4.426 ms
 5  * * 211.102.30.10 (211.102.30.10)  4.358 ms
 6  202.97.63.141 (202.97.63.141)  4.344 ms 202.97.53.117 (202.97.53.117)  3.892 ms 202.97.37.61 (202.97.37.61)  5.872 ms
 7  202.97.87.121 (202.97.87.121)  3.902 ms 202.97.87.153 (202.97.87.153)  3.878 ms *
 8  202.97.97.233 (202.97.97.233)  35.858 ms  40.803 ms  40.796 ms
 9  * 36.110.248.146 (36.110.248.146)  26.951 ms *
10  * 220.181.81.82 (220.181.81.82)  26.931 ms 180.149.128.201 (180.149.128.201)  26.941 ms
11  220.181.17.86 (220.181.17.86)  33.956 ms 220.181.81.10 (220.181.81.10)  26.943 ms *

树状结构的tree

Linux tree命令以树状图列出目录的内容。

执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

官方定义为:

tree - list contents of directories in a tree-like format.

使用方法为:

$ tree  [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] [-o filename] [--nolinks] [-P pattern] [-I pat‐
       tern] [--inodes] [--device]  [--noreport]  [--dirsfirst]  [--version]  [--help]  [--filelimit  #]  [--si]  [--prune]  [--du]
       [--timefmt format] [--matchdirs] [--fromfile] [--] [directory ...]

参数比较多,也比较复杂。其中常用的选项为:

  • -d 显示目录名称而非内容。
  • -D 列出文件或目录的更改时间。

实例 默认显示

默认显示当前目录的信息,比如tree和tree .的含义一样。命令有如下输出结果:

$ tree   
.
├── a
├── aa
│   ├── aab
│   ├── aac
│   ├── aad
│   └── aae
├── b
├── bb
│   └── bbb
├── c
├── d
├── e
└── f

2 directories, 11 files

只显示目录

$ tree -d         
.
├── aa
└── bb

显示具体的修改时间

$ tree -D
.
├── [Apr 7 22:34]  a
├── [Apr 7 22:37]  aa
│   ├── [Apr 7 22:35]  aab
│   ├── [Apr 7 22:35]  aac
│   ├── [Apr 7 22:35]  aad
│   └── [Apr 7 22:35]  aae
├── [Apr 7 22:34]  b
├── [Apr 7 22:39]  bb
│   └── [Apr 7 22:39]  bbb
├── [Apr 7 22:34]  c
├── [Apr 7 22:34]  d
├── [Apr 7 22:33]  e
└── [Apr 7 22:33]  f

2 directories, 11 files

默认情况下tree可能没有安装,可以通过apt/yum install tree来安装。—

Linux的 tty 命令

Linux tty命令用于显示终端机连接标准输入设备的文件名称。

Linux操作系统中,所有外围设备都有其名称与代号,这些名称代号以特殊文件的类型存放于/dev目录下。

比如ttyN就是今天说的设备,而sddN等就是硬盘设备。

你可以执行tty(teletypewriter)指令查询目前使用的终端机的文件名称。

官方定义为:

tty - print the file name of the terminal connected to standard input

使用方法比较简单:

$ tty [-s][--help][--version]

对于-s选项就是–silent,–quiet,即屏蔽掉输出,仅仅显示一个退出状态。

默认使用

默认情况下显示当前终端

$ tty
/dev/pts/4

查询谁在以及在那个tty

Linux里面输入who可以看到目前登陆的用户,而输出信息包括用户名,tty终端,及登陆的时间信息等等。

$ who
user1      pts/4        2017-04-21 19:58 (xxx.xxx.xxx.xxx)
user1      pts/5        2017-04-07 13:41 (:99)
user1      pts/0        2017-04-08 16:31 (:99)
user1      pts/1        2017-04-08 17:12 (:99)
user1      :0           2017-04-15 15:05 (:0)
user1      pts/2        2017-04-15 15:38 (:0)
user2  	   pts/3        2017-04-16 08:53 (:3)
user2      pts/6        2017-04-16 11:01 (:3)
user2      pts/7        2017-04-16 16:49 (:3)
user3      pts/8        2017-04-21 20:05 (xxx.xxx.xxx.xxx)
user3      pts/9        2017-04-21 20:07 (xxx.xxx.xxx.xxx)

而如前面所说,对于write命令其中有一个参数就是指定ttyN的信息。

Linux对打开文件数量的限制 ulimit

… note::
离离原上草,一岁一枯荣。
白居易《草 / 赋得古原草送别》

ulimit简介

对于高并发或者频繁读写文件的应用程序而言,有时可能需要修改系统能够打开的最多文件句柄数,否则就可能会出现too many open files的错误。

而句柄数分为系统总限制和单进程限制。可以使用ulimit -n来查看系统对单个进程的限制及可以打开的文件数目。

或者执行ulimit -a来查看所有的详细信息。

临时修改打开文件数目

对于临时的修改而言,可以终端中输入下面的命令,将该值调整为65536.

$ ulimit -HSn 65535

上面的命令将open files修改为65535,不过退出当前shell后即失效。
H和S分别表示硬限制和软限制

永久修改

如果希望永久修改,需要修改配置文件 /etc/security/limits.conf,修改后需要重新启动系统。

* soft nofile 65535
* hard nofile 65535

其中的*表示所有的用户,softhard分别表示软硬限制,nofile表示能够打开的最大文件数,第四列为具体的值。其中具体的值有一个上次,在文件/proc/sys/fs/nr_open,默认为1048576,完全够用了。

系统总打开句柄限制

上面讨论的均为单个线程的限制,属于线程级别的,系统级别的限制在文件/proc/sys/fs/file-max文件中。

修改这个文件也是临时生效的,重启失效,如果希望永久生效,需要修改下面文件:
/etc/sysctl.conf

可以添加下面这行

fs.file-max = 6815744

然后运行sysctl -p或者重启生效。可以通过lsof -p PID 来查看单个进程打开的文件句柄

linux 之uname命令

Linux uname命令用于打印系统信息。

uname 可显示电脑、操作系统、发行版本等等信息。

官方的定义为:

uname - print system information

使用的方法为:

$ uname [OPTION]...

常用的一些选项为:

  • -a, --all:打印全部的信息
  • -s, --kernel-name:打印内核名
  • -n, --nodename:打印网络节点hostnme,即主机名
  • -r, --kernel-release:打印内核发行版
  • -v, --kernel-version:打印内核版本
  • -m, --machine:打印机器的硬件名字
  • -p, --processor:打印processor或者unknown
  • -i, --hardware-platform:打印硬件平台或者“unknown”
  • -o, --operating-system:打印操作系统

一些实例

显示系统信息,这个基本足矣

$ uname -a
Linux localdomain 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

显示计算机类型:

$ uname -m
x86_64

显示计算机名:

$ uname -n
locaodomain

显示操作系统发行编号:

$ uname -r
3.10.0-1160.36.2.el7.x86_64

显示操作系统名称:

$ uname -s
Linux

显示系统版本与时间:

$ uname -v
#1 SMP Wed Jul 21 11:57:15 UTC 2020

SEE ALSO
arch(1), uname(2)

你是唯一的 uniq

… note::
安得有车马,尚无渔与樵。
宋·王安石《游章义寺》

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

官方定义为:

uniq - report or omit repeated lines

uniq 可检查文本文件中重复出现的行列。

语法

语法比较简单,直接用就可以。

$ uniq [OPTION]... [INPUT [OUTPUT]]

常用的参数为:

  • -c--count 在每列旁边显示该行重复出现的次数。

  • -d--repeated 仅显示重复出现的行列。

  • -u--unique 仅显示出一次的行列。

假定有1个文件为testfile,内容如下:

testfile
	Hello 1
	Hello 2
	Hello 2
	Hello 3
	Hello 3
	Hello 3
	Hello 4
	Hello 4
	Hello 4
    Hello 4

默认无参数

使用uniq 命令可以删除重复的行,不管有多少重复的行,仅仅显示一行。

$  uniq testfile
Hello 1
Hello 2
Hello 3
Hello 4

统计出现频次

如果希望统计每一行出现的频次,可以使用-c参数,其中第一行输出为出现的次数

$  uniq -c testfile
      1 Hello 1
      2 Hello 2
      3 Hello 3
      4 Hello 4

仅仅显示重复的行

在某些情况下,或许只想看到有重复的列,使用-d参数 :

$  uniq -d testfile
Hello 2
Hello 3
Hello 4

仅仅显示不重复的行

而某些情况下,或许只想看到不重复的列,使用-u参数:

$  uniq -u testfile
Hello 1

解压命令之一

… _linux-beginner-unzip:

Linux unzip命令用于解压缩zip文件。

官方的定义为:

unzip - list, test and extract compressed files in a ZIP archive

基本命令

$ unzip file.zip

unzip 只需在命令后跟上要解压的文件名,如 file.zip,将该压缩文件解压缩到当前目录。

指定目录解压

如果需要指定解压缩的目标目录,可以使用 -d 参数:

$ unzip archive.zip -d /path/where/to/extract

这样就会把压缩文件解压到指定的目录中。

不解压某些文件

如果压缩的文件巨大,而不想解压其中的某些,可以用下面的命令

$ unzip file.zip -x data

这个命令的意思为,解压file.zip,但是不把里面的data解压。

linux中创建新用户useradd

useradd用于创建或者更新用户账号信息,是管理员必备的命令之一。

官方的定义为:

useradd - create a new user or update default new user information

使用的方法为:

$ useradd [options] LOGIN

$ useradd -D
    
$ useradd -D [options]

在使用 -D 选项的时候,useradd 命令将使用系统默认、用户命令行指定的参数创建一个新的用户账户。依赖于命令行选项,useradd命令会更新系统文件或者创建用户的home目录并拷贝初始文件,这个除非相当专业,慎用

默认情况下,useradd会创建一个同名的group。

常用的一些选项为:

  • -c, --comment COMMENT :备注,通常会报错在passwd的备注栏中,一般为用户的全名。
  • -d, --home-dir HOME_DIR:指定用户登陆时候的HOME目录
  • -e, --expiredate EXPIRE_DATE:用户账户被禁用的日期,格式为: YYYY-MM-DD。如果不指定,将使用 /etc/default/useradd的值,或者默认取空不过期
  • -s, --shell SHELL:指定登陆后使用的shell,对于不同于默认设定的shell比较有用

默认添加用户

$ sudo useradd username

$ id username 
uid=1001(username) gid=1001(username) groups=1001(username)

正常情况下,创建用户user,会自动在/home目录创建,通过id命令可以看到有同名的group也创建了。

加上备注

$ sudo useradd username -c "USER NAME"

通过这个参数可以设置用户的备注名或者昵称,可以在/etc/passwd中看到,这个对于用户管理而言很方便,而GUI登陆来说比较方便,会显示备注名。

设定登陆的目录

默认情况下创建的目录位于/home ,但是如果希望更改到,比如/home1,那么此时使用-d参数即可,如下:

$ sudo useradd  -d /home1/ username

更改默认的SHELL

有些用户可能对csh情有独钟,那么此时可以使用-s来更改,如下:

$ sudo useradd -s /usr/bin/csh username

目前默认均为bash。

设定失效日期

这个选项通常对于临时账户很有效,比如来了一个实习生,实习一个月就离开,此时2013-03-07,那么一个月以后失效的命令为:

$ sudo useradd username -e 2013-04-07

那么一个月以后,该账户将被禁用登陆。

linux中删除用户userdel

userdel用于删除用户账号信息,是管理员必备的命令之一。

userdel将删除用户帐号与相关的文件。若不加参数,则仅仅删除用户帐号,账号的目录可能还会存在。

官方的定义为:

userdel - delete a user account and related files

使用的方法为:

$ userdel [options] LOGIN

其中LOGIN为将删除的用户名,需要确保其存在,不然会报错。

其中很常用的options为:

  • -r, --remove:删除用户登陆的目录以及目录中所有的文件,还有用户的邮件信息,在其他文件系统的文件可能需要手动删除。
  • -f, --force:这个选项强制删除用户账号,即便该用户仍在登陆。同时还会删除用户的home目录和mail信息。总之很彪悍的一个参数,可能会引起其他问题,慎用慎用,不用不用

默认使用

删除用户账号user,这个选项将把

$ sudo userdel username

彻底删除账号信息

$ sudo userdel -r username

-r参数将把用户的账号以及默认位于/home/username/的所有文件进行删除,谨慎操作,无法找回,除非确认该账号确实不再使用,并且文件确实不在具备价值。

如何确认是否成功?

userdel命令是有返回信息的,如果需要确认命令的执行情况,如下返回值:

  • 0 成功
  • 1 无法更新password文件
  • 2 无效的命令语法
  • 6 指定的用户不存在
  • 8 用户正在登陆
  • 10 无法更新group文件
  • 12 无法移除home目录

警告:如果一个用户还有程序在运行,userdel是不允许删除该账户的。此时可以通过kill掉改程序,或者使用-f来强制删除。

通常情况下,不要这么做。—

Linux usermod 命令

Linux usermod命令用于修改用户账号的各种设置,在多群组权限的情况下,十分常用。

官方定义为:

usermod - modify a user account

语法

用法为:

$ usermod [options] LOGIN

常用的几个参数为:

  • -a 追加用户组,通常与-G一起使用

  • -c COMMENT  修改用户帐号的备注文字

  • -e YYYY-MM-DD  修改帐号的有效期限。

  • -g newgroup 修改用户所属的群组。

  • -G groups  修改用户所属的附加群组。

修改备注名字

正常情况下在创建用户的时候,不太会指定全名,此时可以使用-c来补全备注。

$ usermod -c "Full Name" user

上面的命令将用户user的备注更改为Full Name

指定账号有效期

可以通过-e参数来指定账号的有效期,特别是在知道用户用过一段时间后就不在使用,这种情况十分有效。

$ usermod -e 2015-12-12 user

上面的命令将用户user的有效期定义到2015年12月12日。

重新指定用户组

参数-g将把用户的默认属组更新。

$ usermod -g newgroup user

上面的命令为把user默认组更改为newgroup。正常情况下,用户将在创建的时候默认创建一个同名的群组。

新增用户组

这个指令用的是最多的,也就是把用户同时追加到其他组,如下所示:

$ usermod -a -G group1 group2 group3 user

含义为把用户user同时追加到用户组group1、group2group3

什么?谁?w (who & what)

… code::
去年花里逢君别,今日花开已一年。
韦应物《寄李儋元锡》

w可以认为是加强版的who,果然越简洁越强大,就比如lessmore是功能更多的。

w不仅可以显示谁在登录,还可以打印他们在做什么。w显示的信息如下:

  • 登录的用户;
  • 运行的程序;
  • 第一行显示的信息:当前时间、系统运行的时间、多少用户登录、系统的负载(分贝为1,5,15分钟)

官方定义为:

w - Show who is logged on and what they are doing.

用法为:

$ w [options] user [...]

常用的两个选项为:

  • -h  不显示各栏位的标题信息列。

  • -s  简洁格式列表,不显示用户登入时间,JCPU或者PCPU的时间

默认的显示

显示当前用户的登录信息及执行的命令

$ w
16:29:03 up 26 days,  2:49, 6 users,  load average: 1.00, 0.97, 0.96
USER     TTY      FROM LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/4    :1   07Sep21 20days  9:59   1:53m bash
user     pts/0    :2   08Sep21  6days  0.70s  1:53m zsh
user     pts/1    :3   08Sep21 20days  1:13m  1:53m bash
user      :0      :0   15Sep21 6days  27days 21.36s zsh
user     pts/2    :0   15Sep21 14days  0.25s  0.25s zsh
user     pts/3    :3   16Sep21 24:45m  0.22s  0.22s bash

不显示标题行

$ w -h
16:29:16 up 26 days,  2:49, 6 users,  load average: 1.20, 0.67, 0.76
USER     TTY      FROM  LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/4    :1    07Sep21 20days  9:59   1:53m bash
user     pts/0    :2    08Sep21  6days  0.70s  1:53m zsh
user     pts/1    :3    08Sep21 20days  1:13m  1:53m bash
user      :0      :0    15Sep21 6days  27days 21.36s zsh
user     pts/2    :0    15Sep21 14days  0.25s  0.25s zsh
user     pts/3    :3    16Sep21 24:45m  0.22s  0.22s bash

简洁模式显示

$ w -s
16:29:26 up 26 days,  2:49, 6 users,  load average: 1.50, 0.67, 0.36
USER     TTY      FROM    IDLE   WHAT
user     pts/4    :1     20days  bash
user     pts/0    :2      6days  zsh
user     pts/1    :3     20days  bash
user      :0      :0     6days   zsh
user     pts/2    :0     14days  zsh
user     pts/3    :3     24:45m  bash

可以上墙的广播命令wall

Linux wall命令会将信息传给每一个 mesg 设定为 yes 的上线使用者(可以输入mesg,如果返回is yes就可以收到)。当使用终端登陆的时候,可以使用EOF (通常用 Ctrl+D)。所有人均可以使用该命令。

官方的定义为:

wall – send a message to everybody’s terminal.

所以wall应该是write all user’s teminal的缩写。

使用的方法为:

$ wall [-n] [ message ]

其中参数-n的含义为,修改显示的广播信息放松抬头,看示例即可明白。

这个命令的使用场景为如果需要升级维护系统,可以通过wall命令通知所有在线的用户。

如下:

$ wall
Dear all,
We want to make you aware that this weekend 12PM CST,
there will be scheduled down time for approximately 6 hours.
During this time we will add more capacity and software update
to our infrastructure and service.
Please save all your works and logout for safe.
See you next week.
Regards,
Admin
Ctrl+D #退出

所有登陆的终端都会收到这个消息:

Broadcast message from user@localhost (pts/4) (Mon Apr 18 22:02:22 2011):

Dear all,
We want to make you aware that this weekend 12PM CST,
there will be scheduled down time for approximately 6 hours.
During this time we will add more capacity and software update
to our infrastructure and service.
Please save all your works and logout for safe.
See you next week.
Regards,
Admin

需要注意的是,这个命令最大支持20行的信息,超过了就不会广播了。

如果使用-n参数的效果如下

$ wall -n 'hello'

# 其他终端用户收到的消息
Remote broadcast message (Mon Apr 18 22:05:22 2011):

hello

可以看到此时的通知抬头变成了 Remote broadcast message,去掉了是哪个用户发送的消息。

Linux 之 wc 查看文件信息

wc命令可以查看一下文件的行数、字数、字符数的信息。

官方定义为:

wc - print newline, word, and byte counts for each file

语法

$ wc [-clw][--help][--version][文件...]

参数

  • -c--bytes--chars 只显示Bytes数。
  • -l--lines 显示行数。
  • -w--words 只显示字数。
  • -L--max-line-length 打印最长一行的长度

简单的使用 wc统计

在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。使用的命令为:

$ wc file1 

先查看file1文件的内容,可以看到:

$ cat file1  
Hello World! 
$  wc file1 	# file1文件的统计信息
 1  2 13 file1 	# file1文件的行数为1、单词数2、字节数13 

其中,3 个数字分别表示file1文件的行数单词数,以及该文件的字节数

Ⓜ️同时统计多个文件

如果想同时统计多个文件的信息,例如同时统计file1file2file3,可使用如下命令:

$ wc file*
  1   2  13 file1
  2   5  33 file2
  4  16  76 file3
  7  23 122 total # 总计输出信息

⭐️ 统计最长一行的长度

这个对于终端输出比较有用,要知道以前的终端最长支持80个字符。

其实当前倒是没有这个限制,不过稍短一些的代码看着还是赏心悦目的。

比如查看系统的版本:

$ wc -L /etc/redhat-release 
40 /etc/redhat-release

可知这一行的最长为40个字符。

而此时我们就可以使用这个技巧来获取一个工程所有文件最长的是多少。

非交互的下载工具 wget

Linux系统中的wget是一个下载文件📀的命令行工具,特别普遍 。

对于Linux用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要。

wget支持很多协议,比如HTTPHTTPSFTP协议,还可以使用HTTP代理。

wget的有诸多特点,比如

  • 自动下载 wget支持自动下载,即wget可以在用户退出系统的之后在后台执行。这意味着你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,这是个牛气冲天的功能。
  • 完全重建 wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
  • 高稳定 wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断地尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

命令格式

$ wget [参数] [URL地址]

用于从网络上下载资源,没有指定目录,下载资源会默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

使用范例

wget的命令参数很多,不过常用的为下面几个,详细的可以看进阶。

使用wget下载单个文件

比如,我们下载个Ubuntu的最新版本,试下效果如何

$ wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

使用wget -O下载并以不同的文件名保存

这个对于动态链接的下载比较有用,特别是有些文件的名字实在是太…长了

$ wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234

使用wget -c断点续传

$ wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

# or

$ wget --continue http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget -o把下载信息存入日志文件

$ wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用,特别注意需要与-O来区分开~

你是干什么的 whatis

其实整个命令已出现,你的脑海里面应该浮现的是:

What is your name?

如题所述,这个命令用于查询一个命令到底执行了什么功能,并将查询的结果输出出来,相当于man的一个选项-f

whatis的官方定义为:

whatis - display manual page descriptions

仅仅提供一个比较简单的命令描述.

使用方法也比较简单,如下:

$ whatis [options] name

其中的name可以是Linux命令、系统调用、库函数、系统等等内容

以前面的命令为例,执行如下所示:

$ whatis ls cd file cat more less
ls (1)               - list directory contents
ls (1p)              - list directory contents
cd (1)               - bash built-in commands, see bash(1)
cd (1p)              - change the working directory
cd (n)               - Change working directory
file (1)             - determine file type
file (1p)            - determine file type
file (n)             - Manipulate file names and attributes
cat (1)              - concatenate files and print on the standard output
cat (1p)             - concatenate and print files
more (1)             - file perusal filter for crt viewing
more (1p)            - display files on a page-by-page basis
less (1)             - opposite of more
less (3pm)           - perl pragma to request less of something

可以看到whatis是支持同时查询多个命令的

拓展

whatis可以通过-w-r以及-C等选项来设定通配符、正则表达式以及配置文件等等,不过最简单的还是简单查看一个命令的简单描述,其他的可以交给man来处理。

指定目录的定位 whereis

… note::

你在哪里,哪里就是风景。

Linux whereis 命令用于定位查找一个命令的二进制、源文件或帮助文件。

不过这些文件一般是位于特定目录的。

其他的程序定位可以考虑使用locate命令。

官方的定义为:

whereis - locate the binary, source, and manual page files for a command

使用语法

使用语法如下:

$ whereis [options] [-BMS directory... -f] name...

其他的选项可以为:

  • -b : 查找二进制文件

  • -m:查找手册

  • -s:查找源文件

  • -B <directory>  在设置的目录下查找二进制文件。

  • -M <directory>  在设置的目录下查找说明文件。

  • -S <directory>  在设置的目录下查找原始代码文件。

实例

比如查找bash的位置,输入如下命令:

$ whereis bash
bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

可以看到,以上的输出信息从左至右分别为程序名、bash路径、bash的man帮助手册路径。

单独查找文件

可以通过不同的参数来查找不同的文件,如下:

# 查找二进制文件
$ whereis -b bash
bash: /usr/bin/bash /etc/bash.bashrc 

# 查找帮助文件
$ whereis -m bash
bash: /usr/share/man/man1/bash.1.gz

# 查找源文件
$ whereis -s bash
bash:

Linux which命令

Linux which命令用于查找一个命令,不像findfind是用来查找文件的。

官方定义为:

which - locate a command

改名了会在当前环境变量中查找符合条件的命令。

语法

$ which [-a] filename ...

这个命令基本没有参数,只有一个:

  • -a print all matching pathnames of each argument

如果找到相关的指令并可执行,将返回0.

默认无参数

查找命令并显示具体路径:

$ which bash
/usr/bin/bash 

可能会输出不同,取决于环境变量。

显示所有命令

一个命令,可能会有多个版本,或者同一个版本的多个位置,可以使用-a参数来检

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我们编程吧

为吾笔墨赞赏,莫大荣幸鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值