Linux常用命令--上

which命令

which命令用于标识在终端提示符下键入可执行文件名称或命令时执行的给定可执行文件的位置,该命令在PATH环境变量中列出的目录中搜索作为参数指定的可执行文件。

语法

1
which [options]  COMMAND

参数

  • --version, -[vV]: 输出版本信息。
  • --help: 输出帮助信息。
  • --skip-dot: 跳过PATH中以.开头的目录。
  • --skip-tilde: 跳过PATH中以~开头的目录。
  • --show-dot: 不要在输出中将.扩展到当前目录。
  • --show-tilde: 为非root用户输出HOME目录的波浪号。
  • --tty-only: 如果不在tty上,则停止处理右侧的选项。
  • --all, -a: 打印PATH中的所有匹配项,而不仅仅是第一个。
  • --read-alias, -i: 从标准输入中读取别名列表。
  • --skip-alias: 忽略选项--read-alias,不要读标准输入。
  • --read-functions: 从标准输入读取shell函数。
  • --skip-functions: 忽略选项--read-functions,不要读标准输入。

示例

查看指令bash的绝对路径。

1
2
which bash
# /usr/bin/bash

查看多个命令的绝对路径。

1
2
3
which ping touch
# /usr/bin/ping
# /usr/bin/touch

输出所有在环境变量中的匹配项的绝对路径。

1
2
3
which -a python
# ~/anaconda3/bin/python
# /usr/bin/python

whereis命令

whereis命令用于查找文件,该指令会在特定目录中查找符合条件的文件,该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locatefind命令。

语法

1
whereis [options] file

参数

  • -b: 仅搜索二进制文件。
  • -B <dirs>: 更改或限制whereis搜索二进制文件的位置。
  • -m: 仅搜索源。
  • -M <dirs>: 更改或限制whereis搜索手册部分的位置。
  • -s: 仅搜索源。
  • -S <dirs>: 更改或限制whereis搜索源的位置。
  • -f: 不显示文件名前的路径名称。
  • -u: 搜索不寻常的条目,如果文件没有每种请求类型的一个条目,则该文件被认为是不寻常的,即查找不包含指定类型的文件。
  • -l: 输出有效的查找路径。

示例

列出whereis命令搜索的目录,默认情况下whereis在环境变量中列出的硬编码路径和目录中搜索命令的文件。

1
2
3
4
5
whereis -l
# bin: /usr/bin
# bin: /usr/sbin
# bin: /usr/lib
# ...

获取有关bash命令的信息,输出的bash是要获取其信息的命令,/bin/bash是二进制文件的路径,/etc/bash.bashrc源文件以及/usr/share/man/man1/bash.1.gz手册页,如果要搜索的命令不存在,whereis将仅打印命令名称。

1
2
whereis bash
# bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

whereis命令同时查询netcatuptime,输出将包含有关netcatuptime命令的信息。

1
2
3
whereis netcat uptime
# netcat: /bin/netcat /usr/share/man/man1/netcat.1.gz
# uptime: /usr/bin/uptime /usr/share/man/man1/uptime.1.gz

updatedb命令

updatedb创建或更新locate命令使用的数据库,如果数据库已经存在,则重用其数据以避免重新读取未更改的目录,updatedb通常由cron每天运行以更新默认数据库。

语法

1
updatedb [OPTION]...

参数

  • -f, --add-prunefs FS: 将空格分隔的列表FS中的条目添加到PRUNEFS
  • -n, --add-prunenames NAMES: 将空格分隔的列表名称中的条目添加到pruneName
  • -e, --add-prunepaths PATHS: 将以空格分隔的列表PATHS中的条目添加到PRUNEPATHS
  • -U, --database-root PATH: 仅存储扫描以生成的数据库路径为根的文件系统子树的结果,默认情况下会扫描整个文件系统即/locate输出的条目作为绝对路径名,不包含符号链接,无论PATH的形式如何。
  • -h, --help: 显示帮助信息。
  • -o, --output FILE: 将数据库写入文件,而不是使用默认数据库,数据库默认位置为/var/lib/mlocate/mlocate.db
  • --prune-bind-mounts FLAG: 将PRUNE_BIND_MOUNTS设置为FLAG,覆盖配置文件,默认为no
  • --prunefs FS: 将PRUNEFS设置为FS,以覆盖配置文件。
  • --prunenames NAMES: 将PRUNENAMES设置为NAMES,以覆盖配置文件。
  • --prunepaths PATHS: 将PRUNEPATHS设置为PATHS,以覆盖配置文件。
  • -l, --require-visibility FLAG: 将生成的数据库中的”报告之前要求文件可见性”标志设置为FLAG,默认值为yes。如果FLAG0no,或者数据库文件可被others读取或不属于slocate,那么locate将输出数据库项,运行locate的用户无法读取所需的目录以找到数据库项所描述的文件。如果FLAG1yes,则locate在将每个条目的父目录报告给调用用户之前,先检查其父目录的权限。为了使文件的存在真正被其他用户隐藏,数据库组设置为slocate,并且数据库权限禁止用户使用locate set-gid slocate以外的其他方式读取用户的数据库。注意,仅当数据库由slocate拥有并且others不可读时,才检查可见性标志。
  • -v, --verbose: 将文件的输出路径名输出到标准输出。
  • -V, --version: 输出版本信息。

示例

更新locate命令所使用的数据库。

1
updatedb

更新locate命令所使用的数据库,并输出找到的文件。

1
updatedb -v

指定更新locate命令所使用的数据库的目录。

1
updatedb -U /home

umask命令

Linux和其他类Unix的操作系统上,将使用一组默认权限创建新文件,具体来说,可以通过应用称为umask的权限掩码,以特定方式限制新文件的权限,umask命令指定在建立文件时预设的权限掩码,或者展示当前的权限掩码值。

语法

1
umask [-S] [mask]

参数

  • -S: 以文字的方式来表示权限掩码。
  • mask: 果指定了有效的掩码,则将umask设置为此值,如果未指定掩码,则返回当前的umask值。

权限

使用ll命令查看文件与文件夹相关信息,对于其权限信息:

1
2
3
4
5
6
7
8
9
drwxr-xr-x 12 linuxize users 4.0K Apr  8 20:51 dirname
|[-][-][-] [------] [---]
| | | | | |
| | | | | +-----------> Group
| | | | +-------------------> Owner
| | | +----------------------------> Others Permissions
| | +-------------------------------> Group Permissions
| +----------------------------------> Owner Permissions
+------------------------------------> File Type
  • 首符号为-代表该文件为普通文件,为d则代表目录。
  • 紧接着三个字符rw-代表用户u权限属性。
  • 接下来三个字符r--代表用户组g权限属性。
  • 最后三个字符r--代表其他人o权限属性。

权限可以使用字符表示,同样也可以使用八进制表示信息:

  • r: 读取属性,值为4
  • w: 写入属性,值为2
  • x: 执行属性,值为1

关于操作权限的操作符:

  • +: 为指定的用户类增加指定的文件权限。
  • -:为指定的用户类去除指定的文件权限。
  • =: 为指定的用户类设定指定的文件权限。

工作

本质上,umask的每个数字都从操作系统的默认值中减去,以获得定义的默认值,这不是真正的减法,从技术上讲是将掩码按位取反,然后使用逻辑AND操作将此值应用于默认权限,例如umask值为0022

  • Linux系统上,默认的创建文件权限是666,默认创建文件夹的权限为777
  • 即文件默认权限666 - 022 = 644即现在创建的新文件的权限为644
  • 创建文件夹则为777 - 022 = 755即现在创建的新文件夹的权限为755

此外,第一个零是特殊的权限数字,可以忽略,就当前的目的而言,0002002相同。

示例

查看系统当前umask值。

1
2
umask
# 0022

以符号表示形式表示当前系统权限掩码。

1
2
umask -S
# u=rwx,g=rx,o=rx # 实际上表达的是在所有者或者组以及其他人中的哪些权限已经被取消

将系统umask值设置为022

1
umask 022

tr命令

tr命令用于转换或删除文件中的字符,可以读文件也可以从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

语法

1
tr [OPTION]... SET1 [SET2]

参数

  • -c, -C, --complement: 使用SET1的补码。
  • -d, --delete: 删除SET1中的字符,不翻译。
  • -s, --squeeze-repeats: 用一次出现的字符替换SET1中列出的重复字符的每个输入序列。
  • -t, --truncate-set1: 首先将SET1截断为SET2的长度。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

解释序列

  • \NNN: 八进制值为NNN的字符(13个八进制数字)。
  • \\: 反斜杠。
  • \a: 可闻的BEL
  • \b: 退格键。
  • \f: 换页。
  • \n: 新行。
  • \r: 返回。
  • \t: 水平制表符。
  • \v: 垂直制表符。
  • CHAR1-CHAR2: 从CHAR1CHAR2的所有字符按升序排列。
  • [CHAR*]: 在SET2中,复制CHAR直到SET1的长度。
  • [CHAR*REPEAT]: 重复CHAR的副本,如果以0开头,则重复八进制。
  • [:alnum:]: 所有字母和数字。
  • [:alpha:]: 所有字母。
  • [:blank:]: 所有水平空白。
  • [:cntrl:]: 所有控制字符。
  • [:digit:]: 所有数字。
  • [:graph:]: 所有可打印字符,不包括空格。
  • [:lower:]: 所有小写字母。
  • [:print:]: 所有可打印字符,包括空格。
  • [:punct:]: 所有标点符号。
  • [:space:]: 所有水平或垂直空白。
  • [:upper:]: 所有大写字母。
  • [:xdigit:]: 所有十六进制数字。
  • [=CHAR=]: 等同于CHAR的所有字符。

示例

file.txt文件内容如下。

1
Hello World

将文件中的字母全部转换为大写。

1
2
cat file.txt | tr [a-z] [A-Z]
# HELLO WORLD

同样可以使用[:lower][:upper]参数来实现。

1
2
cat file.txt | tr [:lower:] [:upper:]
# HELLO WORLD

将水平空白符转换为\t

1
2
cat file.txt | tr [:space:] "\t"
# Hello World

删除所有o字符。

1
2
cat file.txt | tr -d "o"
# Hell Wrld

删除所有数字。

1
2
echo "My ID is 73535" | tr -d [:digit:]
# My ID is

取出字符串中的数字。

1
2
echo "My ID is 73535" | tr -cd [:digit:]
# 73535

traceroute命令

traceroute命令尝试跟踪IP数据包到某个Internet主机的路由,方法是使用一个小ttl(生存时间)启动探测数据包,然后侦听来自网关的ICMP超时回复,它以ttl1开始探测,并将其增加1,直到获得ICMP port unreachableTCP reset,这意味着我们到达了host,或达到了最大值(默认为30跳),在每个ttl设置处发送三个探测(默认),并打印一行,显示ttl、网关地址和每个探测的往返时间,在请求时,地址后面可以有附加信息,如果探测结果来自不同的网关,则会打印每个响应系统的地址,如果在5.0秒内(默认值)没有响应,则会为该探测器打印一个*

语法

1
2
3
4
5
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 waittime]
[-z sendwait] [-UL] [-D] [-P proto] [--sport=port] [-M method]
[-O mod_options] [--mtu] [--back] host [packet_len]

参数

  • -4, -6: 显式强制IPv4IPv6跟踪路由,默认情况下,程序将尝试解析给定的名称,并自动选择适当的协议,如果解析主机名同时返回IPv4IPv6地址,则traceroute将使用IPv4
  • -I, --icmp: 使用ICMP ECHO进行探测。
  • -T, --tcp: 使用TCP SYN进行探测。
  • -d, --debug: 启用套接字级调试,如果内核支持的话。
  • -F, --dont-fragment: 不要对探测数据包进行分段,对于IPv4它还会设置DF位,该位告诉中间路由器也不要进行远程分段。通过packet_len命令参数更改探测数据包的大小,可以手动获取有关单个网络跃点的MTU的信息。从Linux内核2.6.22开始,非碎片化功能(例如-F--mtu)才能正常工作,在该版本之前,IPv6始终是零散的,IPv4只能使用一次(从路由缓存中)发现的最终mtu,它可能小于设备的实际mtu
  • -f first_ttl, --first=first_ttl: 指定要启动的TTL,默认为1
  • -g gate,..., --gateway=gate,...: 告诉traceroute向传出数据包添加IP源路由选项,该选项告诉网络通过指定网关路由数据包(出于安全原因,大多数路由器已禁用源路由),通常允许指定多个网关(以逗号分隔的列表)。对于IPv6允许使用numaddraddr...的形式,其中num是路由报头类型(默认为类型2),注意,根据rfc 5095,现在不赞成使用0型路由头。
  • -i device, --interface=device: 指定traceroute应该通过其发送数据包的接口,缺省情况下,接口是根据路由表选择的。
  • -m max_ttl, --max-hops=max_ttl: 指定traceroute探测的最大跳数(最大生存时间值),默认值为30
  • -N squeries, --sim-queries=squeries: 指定同时发送的探测报文数,同时发送多个探针可以大大提高跟踪路由的速度,默认值为16,注意某些路由器和主机可以使用ICMP速率限制,在这种情况下,指定太大的数字可能会导致某些响应丢失。
  • -n: 在显示IP地址时不要尝试将它们映射到主机名。
  • -p port, --port=port: 对于UDP跟踪,指定traceroute将使用的目的端口号,目标端口号将随每个探针递增,对于ICMP跟踪,指定初始ICMP序列值(每个探针也增加),对于TCP和其他协议,仅指定要连接的(恒定)目标端口,使用tcptraceroute包装程序时,-p指定源端口。
  • -t tos, --tos=tos: 对于IPv4,设置服务类型TOS和优先级值,有用的值是16低延迟和8高吞吐量,要使用某些TOS优先级值,必须是超级用户,对于IPv6,设置流量控制值。
  • -l flow_label, --flowlabel=flow_label: 对IPv6数据包使用指定的flow_label
  • -w MAX,HERE,NEAR, --wait=MAX,HERE,NEAR: 设置等待探测响应的时间,以秒为单位,默认为5.0
  • -q nqueries, --queries=nqueries: 设置每个跃点的探测数据包数,默认值为3
  • -r: 绕过常规路由表,并直接发送到连接的网络上的主机,如果主机不在直接连接的网络上,则返回错误,此选项可用于通过没有路由的接口对本地主机执行ping操作。
  • -s src_addr, --source=src_addr: 选择一个备用源地址,请注意必须选择一个接口的地址,默认情况下使用传出接口的地址。
  • -z sendwait, --sendwait=sendwait: 探测之间的最小时间间隔,默认值为0,如果该值大于10,则以毫秒为单位指定一个数字,否则为秒数,也允许使用浮点值,当某些路由器对ICMP消息使用速率限制时非常有用。
  • -e, --extensions: 显示ICMP扩展名,通用格式为CLASS / TYPE即后跟十六进制转储,所示的MPLS多协议标签交换数据已解析,格式为MPLS:L=label,E=exp_use,S=stack_bottom,T=TTL (with any further objects separated by a slash ("/"))
  • -A, --as-path-lookups: 在路由注册表中执行AS路径查找,并在相应地址后直接打印结果。
  • -M name --module=name: 使用指定的模块(内置或外部)用于traceroute操作,大多数方法都有其快捷方式,例如-I表示-M icmp等。
  • -O OPTS,..., --options=OPTS,...: 将特定于模块的选项OPTS用于traceroute模块,允许几个OPTS,以逗号分隔,例如如果OPTShelp,则打印帮助信息。
  • --sport=num: 将源端口号用于传出数据包,表示为-N 1
  • --fwmark=num: 为传出数据包设置防火墙标记。
  • -U --udp: 使用UDP到特定端口进行路由,而不是每个探针增加端口,默认端口为53
  • -UL: 使用UDP LITE进行路由,默认目标端口为53
  • -D --dccp: 使用DCCP请求进行路由,默认端口为33434
  • -P prot --protocol=prot: 使用协议保护的原始数据包进行路由。
  • --mtu: 沿着被追踪的路径发现MTU,表示为-F-N 1
  • --back: 推断后向路径中的跳数,如果不同则打印。
  • -V: 输出版本信息。
  • --help: 输出帮助信息。

示例

使用traceroute查看路由信息。

1
traceroute www.google.com

指定IPv4查看路由信息。

1
traceroute -4 www.google.com

指定要启动的TTL,默认为1

1
traceroute -f 3 www.google.com

不将IP地址解析为其域名。

1
traceroute -n www.google.com

设置每个跃点的探测数,默认为3

1
traceroute -q 1 www.google.com

指定完整的数据包长度,默认是60字节的数据包。

1
traceroute www.google.com 100

设置要使用的目标端口,默认为33434

1
traceroute -p 20292 www.google.com

touch命令

touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间,若文件不存在,系统会建立一个新的文件。

语法

1
touch [OPTION]... FILE...

参数

  • -a: 仅更改访问时间。
  • -c, --no-create: 不创建任何文件。
  • -d, --date=STRING: 解析STRING并使用其作为访问和修改时间。
  • -f: 该参数被忽略。
  • -h, --no-dereference: 影响每个符号链接,而不影响任何引用的文件,仅在可以更改符号链接时间戳的系统上有用。
  • -m: 仅更改修改时间。
  • -r, --reference=FILE: 使用此文件的时间而不是当前时间。
  • -t STAMP: 使用[[CC]YY]MMDDhhmm[.ss]而不是当前时间。
  • --time=WORD: 更改指定的时间,WORDaccessatimeuse则等效于-aWORDModifymtime则等效于-m
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

示例

创建一个空白文件,如果文件已经存在,它将更改文件的访问时间。

1
touch /tmp/file.txt

创建多个文件。

1
touch /tmp/file1.txt /tmp/file2.txt /tmp/file3.txt

模板文件名创建文件。

1
tmpwatch -am 30 –nodirs /tmp/

修改文件的访问时间并查看文件属性。

1
touch -a /tmp/file.txt && stat /tmp/file.txt

修改文件的修改时间并查看文件属性。

1
touch -m /tmp/file.txt && stat /tmp/file.txt

同时修改访问时间和修改时间并设置一个特定的访问与修改时间。

1
touch -am -t 202007010000.00 /tmp/file.txt && stat /tmp/file.txt

top命令

top命令提供运行系统的动态实时视图,其可以显示系统摘要信息,以及当前由内核管理的进程或线程的列表,显示的系统摘要信息的类型以及为任务显示的信息的类型、顺序和大小都是用户可配置的。

语法

1
top -hv | -bcHisS -d delay -n limit -u|U user | -p pid -w [cols]

参数

  • -h: 输出帮助信息。
  • -v: 输出版本信息。
  • -b: 以批处理模式启动top,这对于从top向其他程序或文件发送输出很有用,在这种模式下,top将不接受输入并运行,直到您使用’-n‘命令行选项设置了迭代次数限制或终止为止。
  • -c: 以倒转最后一个记忆中的c状态开始,因此如果top显示命令行,那么现在该字段将显示程序名,反之亦然。
  • -d interval: 指定屏幕更新之间的延迟,并覆盖个人配置文件中的相应值或启动默认值,启动后也可以使用ds交互命令更改。
  • -H: 指示top显示各个线程,如果没有此命令行选项,则显示每个进程中所有线程的总和,启动后可以使用H交互命令更改。
  • -i: 空闲进程切换,以倒转最后一个记忆中的i状态开始,关闭此切换时,将不显示自上次更新以来未使用任何CPU的任务。
  • -n limit: 指定top在结束前应产生的最大迭代次数或帧数。
  • -o: 指定将对任务进行排序的字段的名称,与配置文件中反映的内容无关,您可以在字段名前面加上+-,以覆盖排序方向,前导+将强制从高到低排序,而-将确保从低到高排序,此选项主要用于支持自动脚本化批处理模式操作。
  • -O: 此选项作为上述-o选项的帮助形式,它将使top在单独的一行中打印每个可用的字段名,然后退出。
  • -p pid: 仅监视具有指定进程ID的进程,此选项最多可以给予20次,也可以提供一个逗号分隔的列表,其中最多包含20PID,允许两种方法混合使用,pid值为零将被视为top程序运行时的进程id,这只是一个命令行选项,如果您希望返回正常操作,则无需退出并重新启动top,只需发出以下任何交互式命令=uU,对于puU命令行选项是互斥的。
  • -s: 安全模式操作,以强制的安全模式启动top,即使对于root也是如此,通过系统配置文件可以更好地控制此模式。
  • -S: 累计时间切换,以倒转最后一个记忆中的S状态开始,当累计时间模式打开时,每个进程都会列出它及其子进程使用的cpu时间。
  • -u user-id-or-name, -U user-id-or-name: 仅显示用户id或用户名与给定进程匹配的进程,-u选项匹配有效用户,而-U选项匹配任何用户realeffectivesavedfilesystem,在感叹号!前面加上前缀用户id或名称指示top仅显示用户与提供的进程不匹配的进程,puU命令行选项是互斥的。
  • -w number: 在批处理模式下,如果没有参数,top将使用COLUMNS=LINES=环境变量(如果设置)格式化输出,否则,宽度将固定在最大512列,通过一个参数,可以减少或增加输出宽度(最多512行),但行数被认为是无限的,在正常显示模式下,如果没有参数,top将尝试使用COLUMNS=LINES=环境变量(如果设置)格式化输出,对于参数,输出宽度只能减小,不能增大,无论是使用环境变量还是带有-w的参数,当不处于批处理模式时,都不能超过实际的终端维度,注意如果不使用此命令行选项,输出宽度始终基于调用top的终端,无论是否处于批处理模式。

操作

以下启动默认值操作假定没有相关配置文件,即没有用户自定义,此外带星号*的项目可以通过命令行覆盖。

  • ^Z: 挂起。
  • fg: 恢复挂起的命令。
  • <Left>: 强制屏幕重绘。
  • A: 交叉显示,默认全屏显示。
  • d: *延迟时间,默认为3s
  • H: *线程模式,默认关闭。
  • I: Irix模式,默认开启。
  • p: *监控PID,默认显示所有进程。
  • 1: 查看服务器的cpu逻辑数。
  • M: 根据驻留内存大小进行排序。
  • P: 根据CPU使用百分比大小进行排序。
  • T: 根据时间/累计时间进行排序。
  • c: 切换显示命令名称和完整命令行。
  • t: 切换显示进程和CPU信息。
  • m: 切换显示内存信息。
  • l: 切换显示平均负载和启动时间信息 。
  • o: 改变显示项目的顺序。
  • f: 从当前显示中添加或删除列项目。
  • S: 切换到累计模式。
  • s: 改变两次刷新之间的延迟时间,系统将提示用户输入新的时间,单位为s,如果有小数,就换算成ms
  • q: 退出top命令。
  • i: 忽略闲置和僵尸进程。
  • k: 终止一个进程。

相关信息

概览

  • total: 进程总数。
  • running: 正在运行的进程数。
  • sleeping: 睡眠的进程数。
  • stopped: 停止的进程数。
  • zombie: 僵尸进程数。

CPU信息

  • us: 用户空间占用CPU百分比。
  • sy: 内核空间占用CPU百分比。
  • ni: 用户进程空间内改变过优先级的进程占用CPU百分比。
  • id: 空闲CPU百分比。
  • wa: 等待输入输出的CPU时间百分比。
  • hi: 硬件CPU中断占用百分比。
  • si: 软中断占用百分比。
  • st:虚拟机占用百分比。

列字段

可以使用f交互命令自定义列的位置及其是否可显示。

  • %CPU: CPU UsageCPU使用率,任务自上次屏幕更新以来占用的CPU时间份额,表示为总CPU时间的百分比,在真正的SMP环境中,如果一个进程是多线程的,并且top不是以线程模式运行的,那么可能会报告大于100%的数量,您可以使用H交互命令切换线程模式,同样对于多处理器环境,如果Irixmode处于关闭状态,top将在Solarismode下运行,其中任务的cpu使用量将除以cpu总数,您可以使用I交互命令切换Irix/Solaris模式。
  • %MEM: Memory Usage (RES),内存使用情况,任务当前使用的可用物理内存共享。
  • CGROUPS: Control Groups,控制组,流程所属的控制组的名称,如果不适用于该流程,则为-,控制组用于在安装定义的进程组之间分配资源(cpu、内存、网络带宽等),它们支持对这些资源的分配、拒绝、优先排序、管理和监视进行细粒度控制,一个系统上可以同时存在许多不同的cgroup层次结构,并且每个层次结构都连接到一个或多个子系统,子系统表示单个资源,注意: CGROUPS字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多512个字符),即便如此,这种可变宽度的字段仍然会受到截断。
  • CODE: Code Size (KiB),代码大小KiB,用于可执行代码的物理内存量,也称为文本驻留集大小或TRS
  • COMMAND: Command Name or Command Line,命令名或命令行,显示用于启动任务的命令行或关联程序的名称,您可以使用c在命令行和名称之间切换,这既是一个命令行选项,也是一个交互式命令,当您选择显示命令行时,没有命令行的进程(如内核线程)将只显示程序名,此字段也可能受视图显示模式的影响,注意COMMAND字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多512个字符),即便如此,这种可变宽度的字段仍然会受到截断,当显示命令行时,此字段尤其如此。
  • DATA: Data + Stack Size (KiB),用于可执行代码以外的物理内存量,也称为数据驻留集大小或DRS
  • ENVIRON: Environment variables,显示各个进程看到的所有环境变量(如果有),这些变量将以原始的本机顺序显示,而不是您习惯于用非限定的set看到的排序顺序,注意ENVIRON字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多512个字符),即便如此,这种可变宽度的字段仍然会受到截断。
  • Flags: Task Flags,此列表示任务的当前调度标志,这些标志以十六进制表示,并且不包含零,这些标志正式记录在<linux/sched.h>中。
  • GID: Group Id,有效组ID
  • GROUP: Group Name,有效组名。
  • NI: Nice Value,负的nice值意味着更高的优先级,而正的nice值意味着更低的优先级,此字段中的零表示在确定任务的调度能力时不会调整优先级。
  • P: Last used CPU (SMP),表示最后使用的处理器的数字,在真正的SMP环境中,这可能会频繁更改,因为内核有意使用弱关联,另外,运行top的行为可能会破坏这种弱关联,并导致更多进程更频繁地更改cpu(因为对cpu时间的额外需求)。
  • PGRP: Process Group Id,每个进程都是唯一进程组的成员,该进程组用于分配信号,并由终端对其输入和输出请求进行仲裁,创建(fork)流程时,它将成为其父流程组的成员,按照约定,该值等于流程组的第一个成员(称为流程组长)的流程ID
  • PID: Process Id,任务的唯一进程ID,它定期包装,但从不在零重新启动,在内核中,它是一个由task_struct定义的可调度实体,此值还可用作:进程组ID、会话负责人的会话ID、线程组负责人的线程组ID、进程组负责人的TTY进程组ID
  • PPID: Parent Process Id,任务父进程的进程ID(pid)。
  • PR: Priority,任务的调度优先级,如果在该字段中看到rt,则表示任务正在实时调度优先级下运行,在linux下,实时优先级有些误导,因为传统上操作本身是不可抢占的,虽然2.6内核可以被大部分抢占,但并不总是这样。
  • RES: Resident Memory Size (KiB),任务使用的非交换物理内存。
  • RUID: Real User Id,真实用户ID
  • RUSER: Real User Name,真实的用户名。
  • S: Process Status,任务的状态,可以是: D不间断睡眠、R运行、S睡眠、T跟踪或停止、Z僵尸,显示为正在运行的任务应该更恰当地被认为是准备运行的——它们的任务结构只在Linux运行队列中表示,即使没有真正的SMP机器,根据top的延迟间隔和nice值,也可能会看到许多处于这种状态的任务。
  • SHR: Shared Memory Size (KiB),一个任务可用的共享内存量,通常不是所有的内存都是驻留的,它只是反映了可能与其他进程共享的内存。
  • SID: Session Id,会话是进程组的集合,通常由登录shell建立,新fork的进程加入其创建者的会话,按照惯例,这个值等于会话的第一个成员的进程ID,称为会话头,通常是登录shell
  • SUID: Saved User Id,保存的用户ID
  • SUPGIDS: Supplementary Group IDs,建立的或从任务父级继承的任何补充组的ID,它们以逗号分隔的列表显示,注意SUPGIDS字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多512个字符),即便如此,这种可变宽度的字段仍然会受到截断。
  • SUPGRPS: Supplementary Group Names,登录时建立的或从任务父级继承的任何补充组的名称,它们以逗号分隔的列表显示,注意: SUPGRPS字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多512个字符),即便如此,这种可变宽度的字段仍然会受到截断。
  • SUSER: Saved User Name,保存的用户名。
  • SWAP: Swapped Size (KiB),任务地址空间的非驻留部分。
  • TGID: Thread Group Id,任务所属的线程组的ID,它是线程组负责人的PID,在内核术语中,它表示那些共享mm_struct的任务。
  • TIME: CPU Time,任务自启动以来使用的总CPU时间,当累积模式打开时,每个进程都会列出它及其子进程使用的cpu时间,使用S切换累积模式,这既是命令行选项,也是交互式命令,有关此模式的其他信息,请参阅S交互命令。
  • TIME+: CPU Time, hundredths,与Time相同,但通过百分之一秒反映出更多的粒度。
  • TPGID: Tty Process Group Id,连接的tty的前台进程的进程组ID,如果进程未连接到终端,则为-1,按照惯例,此值等于流程组长的流程ID
  • TTY: Controlling Tty,控制终端的名称,这通常是启动进程的设备(串口、pty等),并用于输入或输出,但是,任务不需要与终端相关联,在这种情况下,您将看到?显示。
  • UID: User Id,任务所有者的有效用户ID
  • USED: Memory in Use (KiB),此字段表示任务已使用的非交换物理内存(RES)加上其地址空间(SWAP)的非驻留部分。
  • USER: User Name,任务所有者的有效用户名。
  • VIRT: Virtual Memory Size (KiB),任务使用的虚拟内存总量。它包括所有代码、数据和共享库,以及已调出的页面和已映射但未使用的页面。
  • WCHAN: Sleeping in Function,取决于内核链接映射的可用性系统地图),此字段将显示任务当前休眠的内核函数的名称或地址,正在运行的任务将在此列中显示一个破折号-,通过显示此字段,top自己的工作集可以增加700Kb以上,具体取决于内核版本,如果发生这种情况,减少开销的唯一方法就是停止并重新启动top
  • nDRT: Dirty Pages Count,自上次写入辅助存储器以来已修改的页数,dirty pages必须先写入辅助存储器,然后才能将相应的物理内存位置用于其他虚拟页。
  • nMaj: Major Page Fault Count,任务发生的主要页错误数,当进程试图读取或写入其地址空间中当前不存在的虚拟页时,会发生页错误,一个主要的页面错误是当辅助存储访问涉及到使该页面可用时。
  • nMin: Minor Page Fault count,任务发生的次要页面错误数,当进程试图读取或写入其地址空间中当前不存在的虚拟页时,会发生页错误,在使该页可用时,较小的页错误不涉及辅助存储器访问。
  • nTH: Number of Threads,与进程关联的线程数。
  • nsIPC: IPC namespace,用于隔离进程间通信(IPC)资源(如SystemVIPC对象和POSIX消息队列)的命名空间的Inode
  • nsMNT: MNT namespace,命名空间的Inode,用于隔离文件系统装入点,从而提供文件系统层次结构的不同视图。
  • nsNET: NET namespace,命名空间的Inode,用于隔离网络设备、IP地址、IP路由、端口号等资源。
  • nsPID: PID namespace,命名空间的Inode,用于隔离进程ID号,这意味着它们不必保持唯一,因此,每个这样的名称空间都可以有自己的init(PID#1)来管理各种初始化任务并获取孤立的子进程。
  • nsUSER: USER namespace,用于隔离用户和组ID号的命名空间的Inode,因此,一个进程可以在用户名称空间外有一个普通的未授权用户ID,而在该名称空间内有一个具有完全根权限的用户ID0
  • nsUTS: UTS namespace,用于隔离主机名和NIS域名的命名空间的Inode, UTS的意思是UNIX分时系统。
  • vMj: Major Page Fault Count Delta,自上次更新以来发生的主要页错误数。
  • vMn: Minor Page Fault Count Delta,自上次更新以来发生的次要页面错误的数量。

示例

显示进程信息。

1
top

显示完整命令。

1
top -c

以批处理模式显示程序信息。

1
top -b

以累积模式显示程序信息。

1
top -S

设置信息更新次数,表示更新两次后终止更新显示。

1
top -n 2

设置信息更新时间,表示更新周期为3秒。

1
top -d 3

显示指定的进程信息,CPU、内存占用率等。

1
top -p 131

不能利用交互式指令来对进程下命令。

1
top -s

tmpwatch命令

tmpwatch递归删除给定时间内未访问的文件,通常用于清理用于临时存放空间的目录,并可以设置文件超期时间,默认单位以小时计算。

语法

1
tmpwatch [-u | -m | -c] [-MUadfqstvx] [--verbose] [--force] [--all] [--nodirs] [--nosymlinks] [--test] [--fuser] [--quiet] [--atime | --mtime | --ctime] [--dirmtime] [--exclude path ] [--exclude-user user ] time dirs

参数

  • -a, --all: 删除所有文件类型,而不仅仅是常规文件,符号链接和目录。
  • -c, --ctime: 根据文件的ctimeinode更改时间,而不是atime来决定删除文件,对于目录根据mtime做出是否删除的决定。
  • -d, --nodirs: 即使目录为空,也不要尝试删除它们。
  • -f, --force: 即使root没有写访问权限,也删除文件类似于rm -f
  • -l, --nosymlinks: 不要尝试删除符号链接。
  • -m, --mtime: 根据文件的mtime即修改时间而不是atime来决定删除文件。
  • -M, --dirmtime: 根据目录的mtime即修改时间而不是atime来决定删除目录,完全忽略目录时间。
  • -q, --quiet: 仅报告致命错误。
  • -s, --fuser: 尝试使用fuser命令来查看文件是否已打开,然后再将其删除,默认情况下未启用,在某些情况下确实有帮助。
  • -t, --test: 不要删除文件,但要执行删除它们的动作,这意味着-v
  • -u, --atime: 根据文件的访问时间来决定是否删除文件,这是默认值,请注意定期的updatedb文件系统扫描会保留最近的目录时间。
  • -U, --exclude-user=user: 不要删除用户拥有的文件,该文件可以是用户名或数字用户ID
  • -v, --verbose: 打印详细显示,有两种详细级别可用。
  • -x, --exclude=path: 跳过路径,如果path是目录,则包含在其中的所有文件也会被跳过,如果路径不存在,则它必须是不包含符号链接的绝对路径。
  • -X, --exclude-pattern=pattern: 跳过路径匹配模式,如果目录与pattern匹配,其中的所有文件也将被跳过,模式必须匹配不包含符号链接的绝对路径。

示例

要从/var/log/日志目录中删除30d以上未访问的文件。

1
tmpwatch 30d /var/log/

列出/tmp/缓存目录中至少30小时未修改的所有文件。

1
tmpwatch –mtime 30 –nodirs /tmp/ –test

删除/tmp/缓存目录中至少30个小时未访问的所有文件。

1
tmpwatch -am 30 –nodirs /tmp/

每日一题

1
https://github.com/WindrunnerMax/EveryDay

参考

1
2
3
https://linux.die.net/man/8/tmpwatch
https://www.runoob.com/linux/linux-comm-tmpwatch.html
https://www.interserver.net/tips/kb/tmpwatch-command-linux/

tmpwatch命令

tmpwatch递归删除给定时间内未访问的文件,通常用于清理用于临时存放空间的目录,并可以设置文件超期时间,默认单位以小时计算。

语法

1
tmpwatch [-u | -m | -c] [-MUadfqstvx] [--verbose] [--force] [--all] [--nodirs] [--nosymlinks] [--test] [--fuser] [--quiet] [--atime | --mtime | --ctime] [--dirmtime] [--exclude path ] [--exclude-user user ] time dirs

参数

  • -a, --all: 删除所有文件类型,而不仅仅是常规文件,符号链接和目录。
  • -c, --ctime: 根据文件的ctimeinode更改时间,而不是atime来决定删除文件,对于目录根据mtime做出是否删除的决定。
  • -d, --nodirs: 即使目录为空,也不要尝试删除它们。
  • -f, --force: 即使root没有写访问权限,也删除文件类似于rm -f
  • -l, --nosymlinks: 不要尝试删除符号链接。
  • -m, --mtime: 根据文件的mtime即修改时间而不是atime来决定删除文件。
  • -M, --dirmtime: 根据目录的mtime即修改时间而不是atime来决定删除目录,完全忽略目录时间。
  • -q, --quiet: 仅报告致命错误。
  • -s, --fuser: 尝试使用fuser命令来查看文件是否已打开,然后再将其删除,默认情况下未启用,在某些情况下确实有帮助。
  • -t, --test: 不要删除文件,但要执行删除它们的动作,这意味着-v
  • -u, --atime: 根据文件的访问时间来决定是否删除文件,这是默认值,请注意定期的updatedb文件系统扫描会保留最近的目录时间。
  • -U, --exclude-user=user: 不要删除用户拥有的文件,该文件可以是用户名或数字用户ID
  • -v, --verbose: 打印详细显示,有两种详细级别可用。
  • -x, --exclude=path: 跳过路径,如果path是目录,则包含在其中的所有文件也会被跳过,如果路径不存在,则它必须是不包含符号链接的绝对路径。
  • -X, --exclude-pattern=pattern: 跳过路径匹配模式,如果目录与pattern匹配,其中的所有文件也将被跳过,模式必须匹配不包含符号链接的绝对路径。

示例

要从/var/log/日志目录中删除30d以上未访问的文件。

1
tmpwatch 30d /var/log/

列出/tmp/缓存目录中至少30小时未修改的所有文件。

1
tmpwatch –mtime 30 –nodirs /tmp/ –test

删除/tmp/缓存目录中至少30个小时未访问的所有文件。

1
tmpwatch -am 30 –nodirs /tmp/

tee命令

tee命令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

语法

1
tee [OPTION]... [FILE]...

参数

  • -a, --append: 追加到已有文件的后面,而不是覆盖文件。
  • -i, --ignore-interrupts: 忽略中断信号。
  • -p: 诊断写入非管道的错误。
  • --output-error[=MODE]: 设置写错误时的行为。
  • --help: 显示帮助信息。
  • --version: 显示版本信息

模式

  • warn: 诊断写入任何输出的错误。
  • warn-nopipe: 诊断写入任何输出而不是管道的错误。
  • exit: 当错误写入任何输出时退出。
  • exit-nopipe: 当写入任何输出(不是管道)时出错时退出。

示例

将用户输入的数据同时保存到文件file1.txtfile2.txt中,输入文件信息后回车即可得到输出反馈。

1
tee file1.txt file2.txt 

将用户输入的数据追加到file1.txt文件。

1
tee -a file1.txt  

ls列出当前目录中所有文件扩展名为.txt的所有文件,每行一个文件名,将输出通过管道传输到wc,将行进行计数并输出数字,输出通过管道传输到tee,将输出写入终端,并将信息写入文件count.txt,即写入文件扩展名为.txt的所有文件的数量。

1
ls -1 *.txt | wc -l | tee count.txt

tee命令

tee命令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

语法

1
tee [OPTION]... [FILE]...

参数

  • -a, --append: 追加到已有文件的后面,而不是覆盖文件。
  • -i, --ignore-interrupts: 忽略中断信号。
  • -p: 诊断写入非管道的错误。
  • --output-error[=MODE]: 设置写错误时的行为。
  • --help: 显示帮助信息。
  • --version: 显示版本信息

模式

  • warn: 诊断写入任何输出的错误。
  • warn-nopipe: 诊断写入任何输出而不是管道的错误。
  • exit: 当错误写入任何输出时退出。
  • exit-nopipe: 当写入任何输出(不是管道)时出错时退出。

示例

将用户输入的数据同时保存到文件file1.txtfile2.txt中,输入文件信息后回车即可得到输出反馈。

1
tee file1.txt file2.txt 

将用户输入的数据追加到file1.txt文件。

1
tee -a file1.txt  

ls列出当前目录中所有文件扩展名为.txt的所有文件,每行一个文件名,将输出通过管道传输到wc,将行进行计数并输出数字,输出通过管道传输到tee,将输出写入终端,并将信息写入文件count.txt,即写入文件扩展名为.txt的所有文件的数量。

1
ls -1 *.txt | wc -l | tee count.txt

split命令

split命令用于将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。

语法

1
split [OPTION]... [FILE [PREFIX]]

参数

  • -a, --suffix-length=N: 使用长度为N的后缀,默认为2
  • --additional-suffix=SUFFIX: 将额外的SUFFIX插入文件名。
  • -b, --bytes=SIZE: 每个输出文件放置SIZE字节,即指定每多少字节切成一个小文件。
  • -C, --line-bytes=SIZE: 每个输出文件最多放入SIZE个字节行,与参数-b相似,但是在切割时将尽量维持每行的完整性。
  • -d: 使用数字后缀而不是字母。
  • --numeric-suffixes[=FROM]: 与-d相同,但允许设置起始值。
  • -e, --elide-empty-files: 不使用-n生成空的输出文件。
  • --filter=COMMAND: 写入shell命令COMMAND,文件名是$FILE
  • -l, --lines=NUMBER: 每个输出文件放入NUMBER行。
  • -n, --number=CHUNKS: 生成CHUNKS输出文件,CHUNKS可以取的值有,N:根据输入大小分为N个文件,K/N:将N的第K个输出到标准输出,l/N: 分割成N个文件,不分割行,l/K/N:输出K的第N到标准输出,而不分割线,r/N:类似于l,但同样使用循环分布r/K/N,但仅将N的第K个输出到标准输出。
  • -t, --separator=SEP: 使用SEP代替换行符作为记录分隔符,\00指定NUL字符。
  • -u, --unbuffered: 立即使用-n r/...将输入复制到输出。
  • --verbose: 在打开每个输出文件之前,输出详细的信息。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

将文件tmp/file.txtN个独立的文件,分别为newaanewabnewac...,每个文件包含2个字节的数据。

1
split -b 2 /tmp/file.txt new

将文件tmp/file.txtN个独立的文件,分别为newaanewabnewac...,每个文件包含2行数据。

1
split -l 2 /tmp/file.txt new

将文件tmp/file.txtN个独立的文件,以数字作为后缀,每个文件包含2行数据。

1
split -d -l 2 /tmp/file.txt new

sort命令

sort命令用于将文本文件内容加以排序,可针对文本文件的内容,以行为单位来排序。

语法

1
2
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

参数

  • -b, --ignore-leading-blanks: 忽略前导空格。
  • -d, --dictionary-order: 只考虑空格和字母数字字符。
  • -f, --ignore-case: 将小写字符转为大写字符。
  • -g, --general-numeric-sort: 按一般数值进行比较。
  • -i, --ignore-nonprinting: 只考虑可打印字符。
  • -M, --month-sort: 比较JAN < ... < DEC
  • -h, --human-numeric-sort: 比较人类可读的数字,例如2K1G
  • -n, --numeric-sort: 根据字符串数值进行比较。
  • -R, --random-sort: 按键的随机哈希排序。
  • --random-source=FILE: 从FILE中获取随机字节。
  • -r, --reverse: 反转比较结果。
  • --sort=WORD: 根据WORD排序:一般数字-g,chan数字-h,月份-M,数字-n,随机-R,版本-V
  • --batch-size=NMERGE: 一次最多合并NMERGE输入,对于更多输入,请使用临时文件。
  • -c, --check, --check=diagnose-first: 检查已排序的输入,不排序。
  • -C, --check=quiet, --check=silent: 类似于-c但不报告第一行错误。
  • --compress-program=PROG: 用PROG压缩临时文件,用PROG-d解压临时文件。
  • --debug: 注释行中用于排序的部分,并向stderr警告可疑用法。
  • --files0-from=F: 从文件F中以NUL结尾的名称指定的文件读取输入,如果F-,则从标准输入读取名称。
  • -k, --key=POS1[,POS2]: 在POS1处开始键(原点1),在POS2处结束键(默认行结束)。
  • -m, --merge: 合并已排序的文件,不排序。
  • -o, --output=FILE: 将结果写入FILE而不是标准输出。
  • -s, --stable: 通过禁用最后的比较来稳定排序。
  • -t, --field-separator=SEP: 使用SEP代替非空到空的转换。
  • -T, --temporary-directory=DIR: 将DIR用于临时文件,而不是$TMPDIR/tmp多个选项指定多个目录。
  • --parallel=N: 将同时运行的排序数更改为N
  • -u, --unique: 对于-c检查严格的顺序,只输出相等运行的第一个。
  • -z, --zero-terminated: 以0字节结束行,而不是换行。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

file.txtfile1.txtfile2.txt文件内容如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# file.txt
abhishek
chitransh
satish
rajan
naveen
divyam
harsh

# file1.txt
50
39
15
89
200

# file2.txt
abc
apple
BALL
Abc
bat
bat

file.txt文件内容进行排序,要保存的话需要使用输出重定向。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sort file.txt
# abhishek
# chitransh
# divyam
# harsh
# naveen
# rajan
# satish

sort file2.txt
# abc
# Abc
# apple
# BALL
# bat
# bat

可以使用-r标志执行逆序排序。

1
2
3
4
5
6
7
8
sort -r file.txt
# satish
# rajan
# naveen
# harsh
# divyam
# chitransh
# abhishek

使用-n对数字进行排序,不使用-n的话则会使用字典序排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
sort -n file1.txt
# 15
# 39
# 50
# 89
# 200

sort file1.txt
# 15
# 200
# 39
# 50
# 89

要对带有反向数字数据的文件进行排序,我们可以使用下面-nr两个选项的组合。

1
2
3
4
5
6
sort -nr file1.txt
# 200
# 89
# 50
# 39
# 15

使用-u排序并删除重复项。

1
2
3
4
5
6
sort -u file2.txt
# abc
# Abc
# apple
# BALL
# bat

使用-c检查文件是否已经按照顺序排序。

1
2
sort -c file2.txt
# sort: file2.txt:4: disorder: Abc

sed命令

sed命令是利用脚本来处理文本文件,可依照脚本的指令来处理、编辑文本文件,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

1
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

参数

  • -n, --quiet, --silent: 禁止自动打印图案空间。
  • -e script, --expression=script: 将脚本添加到要执行的命令中。
  • -f script-file, --file=script-file: 将脚本文件的内容添加到要执行的命令中。
  • --follow-symlinks: 就地处理时遵循符号链接。
  • -i[SUFFIX], --in-place[=SUFFIX]:就地编辑文件,如果提供了后缀,则使用文件扩展名后缀进行备份。
  • -l N, --line-length=N: 为l命令指定所需的换行长度N
  • --POSIX: 禁用所有GNU扩展。
  • -r, --regexp-extended: 在脚本中使用扩展的正则表达式。
  • -s, --separate: 将文件视为单独的文件,而不是单个连续的长文件流。
  • -u, --unbuffered: 从输入文件中加载少量数据,并更频繁地刷新输出缓冲区。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

file.txt文件内容如下。

1
2
3
4
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

将文件中的每行的第一个单词unix替换为linux,要保存的话需要使用输出重定向。

1
2
3
4
5
6
7
sed "s/unix/linux/" file.txt

# linux is great os. unix is opensource. unix is free os.
# learn operating system.
# linux linux which one you choose.
# linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

替换行中模式的第2个匹配项,将行中出现的第二个单词unix替换为linux

1
2
3
4
5
6
sed "s/unix/linux/2" file.txt

# unix is great os. linux is opensource. unix is free os.
# learn operating system.
# unix linux which one you choose.
# unix is easy to learn.linux is a multiuser os.Learn unix .unix is a powerful.

使用替换标志/g全局替换指定sed命令来替换行中所有出现的字符串。

1
2
3
4
5
6
sed "s/unix/linux/g" file.txt

# linux is great os. linux is opensource. linux is free os.
# learn operating system.
# linux linux which one you choose.
# linux is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful.

指定第2个之后的全部匹配模式的字符进行替换。

1
2
3
4
5
6
sed "s/unix/linux/2g" file.txt

# unix is great os. linux is opensource. linux is free os.
# learn operating system.
# unix linux which one you choose.
# unix is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful

用括号括住每个单词的第一个字符,在括号中打印每个单词的第一个字符。

1
2
3
echo "Welcome To The World" | sed "s/\(\b[A-Z]\)/\(\1\)/g"

# (W)elcome (T)o (T)he (W)orld

可以限制sed命令替换特定行号上的字符串。

1
2
3
4
5
6
sed "3 s/unix/linux/g" file.txt

# unix is great os. unix is opensource. unix is free os.
# learn operating system.
# linux linux which one you choose.
# unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

scp命令

scp命令用于Linux之间复制文件和目录,scpsecure copy的缩写,是Linux系统下基于ssh登陆进行安全的远程文件拷贝命令,使用scp可以实现从本地系统到远程系统、从远程系统到本地系统、在本地系统的两个远程系统之间的复制传输。scp是加密的,rcp是不加密的,可以认为scprcp的加强版。

语法

1
scp [OPTION] [user@]SRC_HOST:]file1 [user@]DEST_HOST:]file2

参数

  • -1: 强制scp使用协议1,这是一个较旧的协议。
  • -2: 强制scp使用协议2,这是一个较旧的协议。
  • -3: 两个远程主机之间的副本通过本地主机传输,如果没有此选项,数据将直接在两个远程主机之间复制,此选项还禁用进度表。
  • -4: 强制scp仅使用IPv4地址。
  • -6: 强制scp仅使用IPv6地址。
  • -B: 使用批处理模式,无需任何交互式键盘输入即可运行,这意味着scp无法通过要求用户输入密码来验证会话,此时需要使用密钥进行身份验证。
  • -C: 启用压缩,该压缩将-C标志传递给ssh以启用加密连接的压缩。
  • -c cipher: 选择用于加密数据传输的密码,此选项直接传递给ssh
  • -F ssh_config: 为ssh指定每个用户的备用配置文件,此选项直接传递给ssh
  • -i identity_file: 选择读取RSA身份验证的身份(私钥)的文件,这个选项直接传递给ssh
  • -l limit: 限制使用的带宽,以Kbit/s为单位。
  • -o ssh_option: 可用于以ssh_config中使用的格式将选项传递给ssh,例如AddressFamilyBatchModeBindAddress等等,这对于指定没有单独的scp命令标志的选项非常有用。
  • -P port:指定远程主机上要连接到的端口,注意这个选项是用大写字母P写的,因为-p已经被保留了,用于保存rcp中文件的时间和模式。
  • -p: 保留原始文件的修改时间、访问时间和模式。
  • -q: 禁用进度表。
  • -r: 递归地复制整个目录。
  • -S program: 用于加密连接的程序名称,程序必须能够解析ssh选项。
  • -v: 详细模式,使scpssh打印有关其进度的调试消息,这有助于调试连接,身份验证和配置问题。

示例

file.txt传输到远程主机。

1
2
scp file.txt root@1.1.1.1:/tmp
# file.txt 100% 0 0.0KB/s 00:00

使用私钥将file.txt传输到远程主机。

1
2
scp -i ./v file.txt root@1.1.1.1:/tmp
# file.txt 100% 0 0.0KB/s 00:00

将远程目录中file.txt文件传输到本地,使用私钥验证身份。

1
2
scp -i ./v root@1.1.1.1:/tmp/file.txt ./
# file.txt 100% 0 0.0KB/s 00:00

route命令

在计算机网络中,路由器是负责转发网络流量的设备,当数据报到达路由器时,路由器必须确定将其路由到目的地的最佳方法,route命令用于查看和更改内核路由表,在不同的系统上,命令语法不同,所以实际时可以查看命令的帮助来确定具体使用方法。

语法

1
2
3
4
5
6
7
route [-CFvnee]
route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw]
[metric N] i [mss M] [window W] [irtt m] [reject] [mod] [dyn]
[reinstate] [[dev] If]
route [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm]
[metric N] [[dev] If]
route [-V] [--version] [-h] [--help]

参数

  • (none): 查看当前所有路由定义。
  • -A family: 使用指定的地址族,可以使用route --help查询支持的地址族,通常支持的地址族有inet (DARPA Internet)inet6 (IPv6)ax25 (AMPR AX.25)netrom (AMPR NET/ROM)ipx (Novell IPX)ddp (Appletalk DDP)x25 (CCITT X.25)
  • -F: 对内核的FIB转发信息库路由表进行操作,这是默认值。
  • -C: 操作内核的路由缓存。
  • -v: 输出详细操作。
  • -n: 显示数字地址,而不是尝试确定符号主机名,如果要确定到名称服务器的路由消失的原因,这将很有用。
  • -e: 使用netstat格式显示路由表,-ee将使用路由表中的所有参数生成很长的一行。
  • del: 删除路由。
  • add: 添加路由。
  • target: 目标网络或主机,可以用点分十进制或主机/网络名称提供IP地址。
  • -net: 添加的目标是一个网络。
  • -host: 添加的目标是一个主机。
  • netmask NM: 添加网络路由时,要使用的网络掩码。
  • gw GW: 通过网关路由数据包,必须首先可以访问指定的网关,这通常意味着必须事先设置到网关的静态路由,如果您指定本地接口之一的地址,它将用于确定数据包应路由到的接口。
  • metric M: 将路由表(由路由守护程序使用)中的度量字段设置为M。
  • mss M: 将通过此路由的连接的TCP最大段大小MSS设置为M个字节,缺省值为设备MTU减去标题,或在发生路径mtu发现时使用较低的MTU,当路径mtu发现不起作用时(通常是由于配置错误的防火墙阻止了所需的ICMP碎片),此设置可用于在另一端强制使用较小的TCP数据包。
  • window W: 将通过此路由的连接的TCP窗口大小设置为W字节,仅在AX.25网络上使用,并且驱动程序无法处理背靠背帧。
  • irtt m: 将通过此路由的TCP连接的初始往返时间irtt设置为m毫秒1-12000,仅在AX.25网络上使用,如果省略,则使用RFC 1122默认值300ms
  • reject: 安装阻塞路由,这将强制路由查找失败,这可以用于在使用默认路由之前屏蔽网络,此外要注意这不是用于防火墙。
  • mod, dyn, reinstate: 安装动态或修改后的路线,这些标志用于诊断目的,通常仅由路由守护程序设置。
  • dev If: 强制将路由与指定设备相关联,否则内核将尝试自行确定设备(通过检查现有路由和设备规格以及添加路由的位置),在大多数普通网络中,基本不需要此功能。如果dev If是命令行上的最后一个选项,则可以省略单词dev,因为它是默认值,否则路由修饰符的顺序metric - netmask - gw - dev无关紧要。
  • -h, --help: 输出帮助信息。

示例

显示绑定到服务器的所有IP的路由表。

1
route -n

添加默认网关,这将分配一个网关地址,所有不属于此网络的数据包都将在该网关地址上转发。

1
route add default gw 169.213.0.0

列出内核的路由缓存信息,为了更快地路由数据包,内核保留了路由缓存信息。

1
route -Cn

拒绝路由到特定主机或网络。

1
route add -host 192.168.1.51 reject

删除默认网关,这可能会导致某些互联网故障,所以在继续执行该命令之前,请记下默认网关。

1
route del default

当我们连接PPTP后,通常我们会配置将一个网段添加路由,来指定数据报通过ppp0

1
route add -net 192.168.0.0/16 dev ppp0

配置将一个域名添加路由,来指定数据报通过ppp0

1
route add -host jwgl.sdust.edu.cn dev ppp0

将所有D类多播IP路由都设置为通过eth0

1
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

rm命令

rm命令用于删除一个文件或者目录。

语法

1
rm [OPTION]... [FILE]...

参数

  • -f, --force: 即使文件属性设为只读也直接删除,不逐一确认,此外忽略不存在的文件,不产生提示。
  • -i: 删除之前逐一询问确认。
  • -I: 在删除三个以上文件之前或在递归删除时提示一次,比-i提示的次数少,但仍然可以防止大多数错误。
  • --interactive[=WHEN]: 根据WHEN提示,从不,一次-I或始终-i,如果没有WHEN,则始终提示。
  • --one-file-system: 递归删除层次结构时,跳过文件系统上与相应命令行参数不同的任何目录。
  • --no-preserve-root: 不特别对待/
  • --preserve-root: 不要删除/,默认选项。
  • -r, -R, --recursive: 递归删除目录及其内容。
  • -d, --dir: 删除空目录。
  • -v, --verbose: 输出执行过程。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

删除文件file.txt,如果文件是写保护的,则将提示是否确认要删除。

1
rm file.txt

删除文件file.txt,即使文件是写保护的也不会有确认提示。

1
rm -f file.txt

删除当前目录中的所有文件,如果文件是写保护的,则在rm删除之前将提示。

1
rm *

删除当前目录中的所有文件,rm将不会有任何提示。

1
rm -f *

尝试删除当前目录中的每个文件,但在删除每个文件之前提示确认。

1
rm -i *

删除当前目录中的每个文件,提示确认是否删除三个以上的文件。

1
$ rm -I *

删除目录directory及其包含的所有文件和目录,果rm尝试删除的文件或目录具有写保护,则将提示是否确实要删除。

1
rm -r directory

删除目录directory及其包含的所有文件和目录,不会有任何确认提示。

1
rm -rf mydirectory

read命令

read命令被用来从标准输入读取单行数据,这个命令可以用来读取键盘输入,当使用重定向以及默认选项的情况下,可以读取文件中的一行数据,此时read会将换行符视为行尾,但是可以使用-d选项更改。

语法

1
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] [name2 ...]

参数

  • -a array: 将单词存储在一个名为array的索引数组中,数组元素的编号从0开始。
  • -d delim: 将定界符设置为delim,该字符表示行尾,如果未使用-d,则默认行定界符为换行符。
  • -e: 从shell获取一行输入,用户手动输入字符,直到达到行分隔符为止。
  • -i text: 当与-e结合使用并且仅在不使用-s的情况下,文本将作为输入行的初始文本插入,允许用户在输入行上编辑文本。
  • -n nchars: 如果尚未达到行定界符,则在读取整数nchars个字符后停止读取。
  • -N nchars: 忽略行定界符,仅在已读取nchars个字符,达到EOF或读取超时之后才停止读取。
  • -p prompt: 在开始读取之前,不使用换行符打印字符串提示符。
  • -r: 使用原始输入,具体来说,这个选项使read按字面意思解释反斜杠,而不是将它们解释为转义字符。
  • -s: 当read从终端获取输入时,不显示按键。
  • -t timeout: 如果在超时秒内未读取完整的输入行,则超时并返回失败,如果超时值为零,那么read将不会读取任何数据,但是如果输入可用于读取,则返回成功。如果未指定超时,则使用shell变量TMOUT的值(如果存在),超时值可以是小数,例如3.5
  • -u fd: 从文件描述符fd中读取而不是从标准输入中读取,文件描述符应该是一个small integer

示例

读取终端的输入,循环读入一直持续到按Ctrl + DEOF为止,由于指定变量名text,因此整行文本都存储在变量text中,每当输入一行后按回车时,将会把输入的内容输出。

1
2
3
while read text
do echo "$text"
done

读取终端的输入,指定一个输入的超时时间。

1
2
3
4
5
6
if read -t 3 -p "Text: " text
then
echo "Text: $text"
else
echo -e "\nTimeout"
fi

按行读取文件中的内容。

1
2
3
4
cat test.txt | while read line
do
echo "$line"
done

rcp命令

rcp命令用于复制远程文件或目录,如同时指定两个以上的文件或目录,且最后的目标位置是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中,执行rcp命令以后不会有返回信息,仅需要在目标目录下查看文件或目录是否复制成功即可,rcp不提示输入密码,其通过rsh执行远程执行 ,并且需要相同的授权。

语法

1
rcp [options] [origin] [target]

参数

  • -r: 递归地把源目录中的所有内容拷贝到目标目录中,要使用这个选项,目标位置必须是一个目录。
  • -p: 保留源文件的修改时间和模式,包括拥有者、所属群组、权限与时间,忽略umask
  • -k: 请求rcp获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost确定的远程主机区域内的远程主机的Kerberos许可。
  • -x: 为传送的所有数据打开DES加密,这会影响响应时间和CPU使用率,但是可以提高安全性。
  • -D: 指定远程服务器的端口号。

示例

远程复制file.txt文件。

1
rcp root@1.1.1.1:/file.txt file.txt

ps命令

Linux是一个多任务、多用户的操作系统,因此它允许多个进程同时运行而不相互干扰,进程是Linux操作系统的重要基本概念之一,进程是程序的执行实例,在操作系统中执行不同的任务。Linux为我们提供了一个名为ps的实用程序,用于查看与系统上的进程相关的信息,它是process status进程状态的缩写,ps命令用于列出当前正在运行的进程,它们的pid以及一些其他信息取决于不同的选项,它从/proc文件系统中的虚拟文件读取进程信息,/proc包含虚拟文件,这就是它被称为虚拟文件系统的原因,process status命令ps显示有关活动进程的信息,类似于windows的任务管理器,每个操作系统的ps版本都略有不同,因此若要是需要获取详细情况则需要查阅操作系统的wiki

语法

1
ps [options]

参数

ps命令有多种类别的参数可以选择: simple|list|output|threads|misc|all

Simple Process Selection

  • -A, -e: 选择所有进程。
  • -a: 选择除会话引线和与终端无关的进程之外的所有进程。
  • a: 列出带有终端tty的所有进程,包括其他用户进程,或者在与x选项一起使用时列出所有进程。
  • -d: 选择除会话所属者以外的所有进程。
  • -N, --deselect: 选择除满足指定条件的进程以外的所有进程。
  • r: 将选择限制为仅运行进程。
  • T: 选择与此终端关联的所有进程。
  • x: 列出拥有的所有进程(和ps相同的EUID),或者在和a选项一起使用时列出所有进程。

Process Selection By List

  • -C <command>: 按命令名选择,这将选择其可执行名称在command中给定的进程。
  • -G, --Group <GID>: 按真实组ID (RGID)或名称选择,这将选择其真实组名或IDgrplist列表中的进程。
  • -g, --group <group>: 按会话或有效组名选择。
  • -p, p, --pid <PID>: 按进程ID选择。
  • --ppid <PID>: 按父进程ID选择,这将选择pidlist中具有父进程ID的进程,也就是说,它选择的进程是pidlist中列出的那些进程的子进程。
  • -q, q, --quick-pid <PID>: 按进程ID选择(快速模式)。
  • -s, --sid <session>: 按会话ID选择。
  • -t, t, --tty <tty>: 通过tty (terminal)选择。
  • -u, U, --user <UID>: 根据有效的用户ID (EUID)或名称选择。
  • -U, --User <UID>: 按真实用户ID (RUID)或名称选择。

Output Format Control

  • -F: 额外的完整格式。
  • -f: 进行全格式列表,可以将此选项与其他UNIX样式的选项结合使用以添加其他列,它还会导致命令参数被打印,与-L一起使用时,将添加NLWP线程数和LWP线程ID列。
  • f, --forest:ASCII art进程层次结构,如许多树,也称为林。
  • -H: 显示进程层次结构(林)。
  • -j: 作业格式。
  • j: BSD作业控制格式。
  • -l: 长格式,-y选项通常对此很有用。
  • l: 显示BSD长格式。
  • -M, Z: 对于SE Linux添加一列安全数据。
  • -O <format>: 使用默认列预加载。
  • O <format>: 与-O类似,具有BSD特性。
  • -o, o, --format <format>: 指定用户定义的格式。
  • s: 显示信号格式。
  • u: 显示面向用户的格式。
  • v: 显示虚拟内存格式。
  • X: 寄存器格式。
  • -y: 不显示标志,显示rss代替addr,此选项只能与-l一起使用。
  • --context: 使用SE Linux时,显示安全上下文格式。
  • --headers: 重复标题行,每页输出一行。
  • --no-headers: 完全不打印标题行。
  • --cols, --columns, --width <num>: 设置屏幕宽度。
  • --rows, --lines <num>: 设置屏幕高度。

Thread Display

  • H: 将线程显示为进程。
  • -L: 显示线程,可能带有LWPNLWP列。
  • -m, m: 在进程之后显示线程。
  • -T: 显示线程,可能带有SPID列。

Miscellaneous options

  • -c: 为-l选项显示不同的调度程序信息。
  • c: 显示真实的命令名称。
  • e: 在命令后显示环境。
  • k, --sort: 指定排序顺序为[+|-]key[,[+|-]key[,...]]
  • L: 显示格式说明符。
  • n: 显示数字uidwchan
  • S, --cumulative: 包含一些dead子进程数据。
  • -y: 不显示标志,显示rss,仅与-l一起使用。
  • -V, V, --version: 显示版本信息。
  • -w, w: 无限制的输出宽度。
  • --help <simple|list|output|threads|misc|all>: 显示帮助信息。

示例

显示当前shell的进程。

1
ps

查看所有正在运行的进程。

1
ps -e

通常查看所有进程可以与管道以及grep命令结合用以过滤,例如我们查看与nginx有关的所有进程。

1
ps -e | grep nginx

查看除会话引线和未与终端关联的进程之外的所有进程。

1
ps -a

查看www用户的所有进程。

1
ps -u www

查看www组的所有进程。

1
ps -G www

使用-f查看完整格式列表。

1
ps -f

按用户自定义格式查看进程。

1
ps -aN --format cmd,pid,user,ppid

根据内存占用情况将进程排序。

1
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

显示所有当前进程,为了便于查看可以结合管道和less命令来使用。

1
ps -ax | less

使用aux参数,加入CPU与内存用量信息,来显示全面的信息。

1
ps -aux | less

根据CPU使用将进程降序排序。

1
ps -aux --sort -pcpu | less

根据内存使用将进程降序排序。

1
ps -aux --sort -pmem | less

合并内存与CPU的整体使用情况进行排序,并只显示前10个结果。

1
ps -aux --sort -pcpu,+pmem | head -n 10

pico命令

pico是一个简单易用、以显示导向为主的文字编辑程序,具有pine电子邮件编写器的风格。在现代Linux系统上,nanopicoGNU版本是默认安装的,在使用上和pico一模一样。

语法

1
nano [OPTIONS] [[+LINE[,COLUMN]] FILE]...

参数

  • +LINE[,COLUMN]: 启动时将光标放置在行号行和列号列,而不是默认的第1行第1列。
  • -?: 与-h相同。
  • -A, --smarthome: 使Home键更智能,如果在一行中非空格字符的开头但在任何地方按Home键,则光标将跳到该开头(向前或向后),如果光标已经在该位置,它将跳到该行的真实开头。
  • -B, --backup: 保存文件时,将以前版本的文件备份到以~为后缀的当前文件名。
  • -C dir, --backupdir=dir: 如果启用了文件备份,请设置nano放置唯一备份文件的目录。
  • -D, --boldtext: 使用粗体文本而不是反向视频文本。
  • -E, --tabstospaces: 将键入的制表符转换为空格。
  • -F, --multibuffer: 如果可用,启用多个文件缓冲区。
  • -H, --historylog: 记录搜索并将字符串替换为~/.nano_history,如果有nanorc支持,则可以在以后的会话中检索它们。
  • -I, --ignorercfiles: 如果有nanorc支持,不要检索SYSCONFDIR/nanorc~/.nanorc
  • -K, --rebindkeypad: 解释数字小键盘的键,以便它们都可以正常工作。如果不需要,则不需要使用此选项,因为启用此选项后,鼠标支持将无法正常工作。
  • -L, --nonewlines: 不要在文件末尾添加换行符。
  • -N, --noconvert: 禁止从DOS/Mac格式自动转换文件。
  • -O, --morespace: 使用标题栏下方的空白行作为额外的编辑空间。
  • -Q str, --quotestr=str: 设置引号字符串以进行证明。如果有扩展的正则表达式支持,则默认值为^([ \t]*[#:>\|}])+,否则为>。请注意\t代表Tab
  • -R, --restricted: 限制模式,不读取或写入命令行中未指定的任何文件,读取任何nanorc文件,允许挂起,允许将文件附加到其他名称(如果已经有文件名)或以其他名称保存,或者使用备份文件或拼写检查。也可以通过使用以r开头的任何名称调用nano(例如rnano)进行访问。
  • -S, --smooth: 启用平滑滚动,文本将逐行滚动,而不是通常的逐块行为。
  • -T cols, --tabsize=cols: 将选项卡的大小(宽度)设置为列,cols的值必须大于0,默认值为8
  • -U, --quickblank: 快速清除状态栏,1次按键而不是25次按键后,状态栏消息将消失,请注意-c会覆盖此内容。
  • -V, --version: 输出版本信息。
  • -W, --wordbounds: 通过将标点符号视为单词的一部分,可以更准确地检测单词边界。
  • -Y str, --syntax=str: 从nanorc中指定要使用的特定语法高亮显示(如果可用)。
  • -c, --const: 不断显示光标位置,请注意这将覆盖-U
  • -d, --rebinddelete: 以不同的方式解释Delete键,以便退格键和Delete键都能正常工作,只有当退格符在系统上的作用类似于Delete时,您才需要使用此选项。
  • -h, --help: 输出帮助信息。
  • -i, --autoindent: 将新行缩进到前一行的缩进中,在编辑源代码时很有用。
  • -k, --cut: 启用从光标到行尾的剪切。
  • -l --nofollow: 如果正在编辑的文件是符号链接,请用新文件替换该链接,而不是跟随它,,也许适合在/tmp中编辑文件。
  • -m, --mouse: 启用鼠标支持(如果适用于您的系统)。设置快捷方式时,可以用鼠标双击鼠标来执行标记,鼠标将在X窗口系统中工作,并在gpm运行时在控制台上工作。
  • -o dir, --operatingdir=dir: 设置操作目录,使nano设置类似于chroot
  • -p, --preserve: 保留XONXOFF序列^Q^S,以便它们被终端捕获。
  • -r cols, --fill=cols: 在列cols处换行,如果此值等于或小于0,则将在屏幕的宽度减去cols列的宽度处进行换行,如果调整了屏幕大小,则换行点将随着屏幕的宽度而变化,默认值为-8
  • -s prog, --speller=prog: 启用备用拼写检查程序命令。
  • -t, --tempfile: 始终保存更改的缓冲区而无提示,与Pico-t选项相同。
  • -v, --view: 查看文件(只读)模式。
  • -w, --nowrap: 禁用长行换行。
  • -x, --nohelp: 禁用编辑器底部的帮助屏幕。
  • -z, --suspend: 启用暂停功能。
  • -a, -b, -e, -f, -g, -j: 由于与Pico的兼容性而被忽略。

示例

使用nano编辑文件,根据操作提示编辑文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
nano file.txt

# ^G Get Help
# ^O WriteOut
# ^R Read File
# ^Y Prev Page
# ^K Cut Text
# ^C Cur Pos
# ^X Exit
# ^J Justify
# ^W Where Is
# ^V Next Page
# ^U UnCut Text
# ^T To Spell

patch命令

patch指令让用户利用设置修补文件的方式、修改、更新原始文件,倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行,如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。

语法

1
patch [OPTION]... [ORIGFILE [PATCHFILE]]

参数

  • -b, --backup: 备份每一个原始文件。
  • -B<pref>, --prefix=<pref>: 设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
  • -c, --context: 把修补数据解译成关联性的差异。
  • -d<dir>, --directory=<dir>: 设置工作目录。
  • -D<define>, --ifdef=<define>: 用指定的符号把改变的地方标示出来。
  • -e, --ed: 把修补数据解译成ed指令可用的叙述文件。
  • -E, --remove-empty-files: 若修补过后输出的文件其内容是一片空白,则移除该文件。
  • -f, --force: 此参数的效果和指定-t参数类似,但会假设修补数据的版本为新版本。
  • -F<num >, --fuzz<num >: 设置监别列数的最大值。
  • -g<num>, --get=<num>: 设置以RSCSCCS控制修补作业。
  • -i<patchfile>, --input=<patchfile>: 读取指定的修补文件。
  • -l, --ignore-whitespace: 忽略修补数据与输入数据的跳格,空格字符。
  • -n, --normal: 把修补数据解译成一般性的差异。
  • -N, --forward: 忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。
  • -o<outfile>, --output=<outfile>: 设置输出文件的名称,修补过的文件会以该名称存放。
  • -p<num>, --strip=<num>: 设置欲剥离几层路径名称。
  • -f<rejectfile>, --reject-file=<rejectfile>: 设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej
  • -R, --reverse: 假设修补数据是由新旧文件交换位置而产生。
  • -s, --quiet或--silent: 不显示指令执行过程,除非发生错误。
  • -t, --batch: 自动略过错误,不询问任何问题。
  • -T, --set-time: 此参数的效果和指定-Z参数类似,但以本地时间为主。
  • -u, --unified: 把修补数据解译成一致化的差异。
  • -v, --version: 显示版本信息。
  • -V<method>, --version-control=<method>: 用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用-z参数变更,当使用-V参数指定不同备份方式时,也会产生不同字尾的备份字符串。
  • -Y<pref>, --basename-prefix=--<pref>: 设置文件备份时,附加在文件基本名称开头的字首字符串。
  • -z<suffix>, --suffix=<suffix>: 此参数的效果和指定-B参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上backup/字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
  • -Z, --set-utc: 把修补过的文件更改,存取时间设为UTC
  • --backup-if-mismatch: 在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
  • --binary: 以二进制模式读写数据,而不通过标准输出设备。
  • --help: 在线帮助。
  • --nobackup-if-mismatch: 在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
  • --verbose: 详细显示指令的执行过程。

示例

使用补丁包/tmp/file.patch为文件/tmp/file2.txt升级。

1
2
# diff /tmp/file2.txt /tmp/file3.txt > /tmp/file.patch # 生成补丁文件
patch /tmp/file2.txt /tmp/file.patch

paste命令

paste命令会把每个文件以列对列的方式,一列列地加以合并。

语法

1
paste [OPTION]... [FILE]...

参数

  • -d, --delimiters=[LIST]: 用指定的间隔字符取代TABs字符。
  • -s, --serial: 一次粘贴一个文件,而不是并行粘贴。
  • -z, --zero-terminated: 行定界符为NUL,而不是换行符。
  • --help: 显示此帮助并退出。
  • --version: 输出版本信息并退出。

示例

按列合并/tmp/file1.txt/tmp/file2.txt文件。

1
paste /tmp/file1.txt /tmp/file2.txt

按列合并/tmp/file1.txt/tmp/file2.txt文件,并追加到/tmp/file3.txt

1
paste /tmp/file1.txt /tmp/file2.txt >> /tmp/file3.txt

按列合并/tmp/file1.txt/tmp/file2.txt文件,并指定间隔符-

1
paste -d - /tmp/file1.txt /tmp/file2.txt

od命令

od命令会读取所指定的文件的内容,并将其内容以八进制字节码呈现出来。

语法

1
2
3
od [OPTION]... [FILE]...
od [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]
od --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]

参数

  • -A, --address-radix=RADIX: 选择要以何种基数计算字码。
  • -j, --skip-bytes=BYTES: 跳过设置的字符数目。
  • -N, --read-bytes=BYTES: 到设置的字符数目为止。
  • -S BYTES, --strings[=BYTES]: 输出至少BYTES图形字符的字符串,未指定BYTES时默认3
  • -t, --format=TYPE: 设置输出格式。
  • -v, --output-duplicates: 输出时不省略重复的数据。
  • -w[BYTES], --width[=BYTES]: 设置每列的最大字符数。
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

格式控制

  • -a: 与-t a相同,选择命名字符。
  • -b: 与-t o1相同,选择八进制字节。
  • -c: 与-t c相同,选择ASCII字符或反斜杠转义。
  • -d: 与-t u2相同,选择无符号十进制2字节单位。
  • -f: 与-t fF相同,选择浮点数。
  • -i: 与-t dI相同,选择十进制整数。
  • -l: 与-t dL相同,选择十进制长。
  • -o: 与-t o2相同,选择八进制2字节单位。
  • -s: 与-t d2相同,选择十进制2字节单位。
  • -x: 与-t x2相同,选择十六进制2字节单位。
  • d[SIZE]: 有符号十进制,每个整数SIZE个字节。
  • f[SIZE]: 浮点数,每个整数SIZE个字节。
  • o[SIZE]: 八进制,每个整数SIZE个字节。
  • u[SIZE]: 无符号十进制,每个整数SIZE个字节。
  • x[SIZE]: 十六进制,每个整数SIZE个字节。

示例

输出文件八进制字节码。

1
od /tmp/file.txt

使用单字节八进制解释进行输出,左侧的默认地址格式为八字节。

1
od -c /tmp/file.txt

使用ASCII码进行输出,其中包括转义字符,左侧的默认地址格式为八字节。

1
od -t d1 /tmp/file.txt

netstat命令

netstat命令显示各种网络相关信息,例如网络连接、路由表、接口统计信息、伪装连接、多播成员身份等。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w] 
[--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts]
[--numeric-ports] [--numeric-users] [--symbolic|-N]
[--extend|-e[--extend|-e]] [--timers|-o] [--program|-p]
[--verbose|-v] [--continuous|-c]

netstat {--route|-r} [address_family_options] [--extend|-e[--extend|-e]]
[--verbose|-v] [--numeric|-n] [--numeric-hosts] [--numeric-ports]
[--numeric-users] [--continuous|-c]

netstat {--interfaces|-i} [--all|-a] [--extend|-e[--extend|-e]] [--verbose|-v]
[--program|-p] [--numeric|-n] [--numeric-hosts] [--numeric-ports]
[--numeric-users] [--continuous|-c]

netstat {--groups|-g} [--numeric|-n] [--numeric-hosts] [--numeric-ports]
[--numeric-users] [--continuous|-c]

netstat {--masquerade|-M} [--extend|-e] [--numeric|-n] [--numeric-hosts]
[--numeric-ports] [--numeric-users] [--continuous|-c]

netstat {--statistics|-s} [--tcp|-t] [--udp|-u] [--raw|-w]

netstat {--version|-V}

netstat {--help|-h}

address_family_options may be any combination of the following options:
[-4] [-6] [--protocol={inet,unix,ipx,ax25,netrom,ddp}[,...]] [--unix|-x]
[--inet|--ip] [--ax25] [--ipx] [--netrom] [--ddp]

参数

netstat打印的信息类型由第一个参数控制,该参数是以下参数之一:

  • (none): 默认情况下,netstat显示打开的套接字列表,如果未指定任何地址族,则将打印所有已配置地址族的活动套接字。
  • --route, -r: 显示内核路由表,netstat -rroute -e产生相同的输出。
  • --groups, -g: 显示IPv4IPv6的多播组成员身份信息。
  • --interfaces, -i: 显示所有网络接口的表。
  • --masquerade, -M: 显示伪装的连接列表。
  • --statistics, -s: 显示每个协议的摘要统计信息。

在第一个参数之后,以下选项指定netstat的报告行为:

  • --verbose, -v: 通过详细操作告诉用户发生了什么,特别是打印一些有关未配置地址族的有用信息。
  • --wide, -W: 使用指定宽度而不根据使用输出来截断IP地址,为了不破坏现有的脚本,这是可选的。
  • --numeric, -n: 显示数字地址,而不是尝试确定符号主机、端口或用户名。
  • --numeric-hosts: 显示数字主机地址,但不影响端口或用户名的解析。
  • --numeric-ports: 显示数字端口号,但不影响主机名或用户名的解析。
  • --numeric-users: 显示数字用户id,但不影响主机名或端口名的解析。
  • --protocol=family, -A: 指定要显示其连接的地址族(低级协议),该族是逗号分隔的地址族关键字列表,如inetunixipxax25netromddp,这与使用--inet-unix(-x)-ipx-ax25-netrom--ddp选项具有相同的效果,地址族inet包括rawudptcp协议套接字。
  • -c, --continuous: 使netstat每秒连续打印所选信息。
  • -e, --extend: 显示附加信息,使用此选项两次以获得最大细节。
  • -o, --timers: 包括与网络计时器相关的信息。
  • -p, --program: 显示PID进程标识符和每个套接字所属的程序的名称。
  • -l, --listening: 只显示监听套接字,这些在默认情况下被省略。
  • -a, --all: 显示监听和非监听套接字,使用--interfaces选项显示未启动的接口。
  • -F: 从FIB打印路由信息,这是默认设置。
  • -C: 从路由缓存中打印路由信息。

网络连接

关于活跃的互联网连接TCPUDPraw的信息属于以下类别:

  • Proto: 套接字使用的协议tcpudpraw
  • Recv-Q: 连接到此套接字的用户程序未复制的字节数。
  • Send-Q: 远程主机未确认的字节数。
  • Local Address: 套接字本地端的地址和端口号,除非指定了--numeric, -n选项,否则套接字地址将解析为其规范的主机名FQDN,并且端口号将转换为相应的服务名。
  • Foreign Address: 套接字远端的地址和端口号,类似于本地地址。
  • State: socket的状态,由于在原始套接字raw模式中没有状态,而且UDP中通常没有使用状态,因此这一列可以留空,通常这可以是以下值之一,TCP握手与挥手的过程中通常会经历这些状态。
    • ESTABLISHED: 套接字已建立连接。
    • SYN_SENT: 套接字正在积极尝试建立连接。
    • SYN_RECV: 从网络接收到连接请求。
    • FIN_WAIT1: 套接字已关闭,连接正在关闭。
    • FIN_WAIT2: 连接已关闭,套接字正在等待从远端关闭。
    • TIME_WAIT: 套接字在关闭后正在等待处理仍在网络中的数据包。
    • CLOSE: 没有使用该套接字。
    • CLOSE_WAIT: 远端已关闭,等待套接字关闭。
    • LAST_ACK: 远端已经关闭,套接字已关闭,等待确认。
    • LISTEN: 套接字正在监听传入的连接,除非指定--listening, -l--all, -a选项,否则此类套接字不包含在输出中。
    • CLOSING: 两个套接字都关闭了,但我们仍然没有发送所有的数据。
    • UNKNOWN: 套接字的状态未知。
  • User: 套接字所有者的用户名或用户ID(UID)
  • PID/Program name: 进程ID(PID)和拥有套接字的进程的进程名称之间用斜杠分隔,--program使该列包括在内,需要超级用户特权才能在不拥有的套接字上查看此信息,此标识信息尚不适用于IPX套接字。

UNIX域套接字

有关活动UNIX域套接字的信息属于以下类别:

  • Proto: 套接字使用的协议,通常是unix
  • RefCnt: 引用计数,即通过此套接字连接的进程。
  • Flags: 显示的标志是SO_ACCEPTON显示为ACCSO_WAITDATA(W)SO_NOSPACE(N),如果未连接的套接字的相应进程正在等待连接请求,则在未连接的套接字上使用SO_ACCECPTON,其他标志不是正常的关注点。
  • Type: 套接字访问有几种类型:
    • SOCK_DGRAM: 套接字用于数据报(无连接)模式。
    • SOCK_STREAM: 这是一个流(连接)套接字。
    • SOCK_RAW: 该套接字用作原始套接字。
    • SOCK_RDM: 这个服务提供可靠的消息传递。
    • SOCK_SEQPACKET: 这是一个顺序数据包套接字。
    • SOCK_PACKET: 原始接口访问套接字。
  • State: 该字段将包含以下关键字之一:
    • FREE: 未分配套接字。
    • LISTENING:套接字正在监听连接请求,仅当指定--listening, -l--all, -a选项时,此类套接字才会包含在输出中。
    • CONNECTING: 套接字即将建立连接。
    • CONNECTED: 套接字已连接。
    • DISCONNECTING: 套接字正在断开连接。
    • (empty): 该套接字未连接到另一套接字。
  • PID/Program name:打开套接字的进程的进程ID(PID)和进程名称。
  • Path: 这是相应进程附加到套接字的路径名。
  • Active IPX sockets: 活动IPX套接字的列表。
  • Active NET/ROM sockets: 活动NET/ROM套接字的列表。
  • Active AX.25 sockets: 活动AX.25套接字的列表。

文件

netstat使用以下文件:

  • /etc/services: 服务转换文件。
  • /proc: proc文件系统的挂载点,它以文件层次结构的形式提供对内核状态信息的访问。
  • /proc/net/dev: 设备信息文件。
  • /proc/net/raw: 原始套接字信息。
  • /proc/net/tcp: TCP套接字信息。
  • /proc/net/udp: UDP套接字信息。
  • /proc/net/igmp: IGMP多播信息。
  • /proc/net/unix: Unix域套接字信息。
  • /proc/net/ipx: IPX套接字信息。
  • /proc/net/ax25: AX25套接字信息。
  • /proc/net/appletalk: DDP(appletalk)套接字信息。
  • /proc/net/nr: NET/ROM套接字信息。
  • /proc/net/route: IP路由信息。
  • /proc/net/ax25_route: AX25路由信息。
  • /proc/net/ipx_route: IPX路由信息。
  • /proc/net/nr_nodes: NET/ROM节点列表。
  • /proc/net/nr_neigh: NET/ROM邻居。
  • /proc/net/ip_masquerade: 伪装的连接。
  • /proc/net/snmp: 统计。

示例

显示所有listeningnon-listening的套接字,并使用管道和less便于查看当前状态。

1
netstat -a | less

列出所有TCP端口。

1
netstat -at

列出所有udp端口。

1
netstat -au

仅列出侦听端口。

1
netstat -l

列出所有端口的统计信息。

1
netstat -s | less

显示使用TCPPID和程序名。

1
netstat -pt

获取内核路由信息。

1
netstat -r

获取与ssh相关的进程的网络信息。

1
netstat -ap | grep ssh

获取80端口的网路状态信息。

1
netstat -anp |grep :80

获取网络接口列表。

1
netstat -i

获取网络接口列表与拓展信息。

1
netstat -ie

配合awk命令获取TCP套接字的状态统计信息。

1
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

mv命令

mv命令用来为文件或目录改名、或将文件或目录移入其它位置。

语法

1
2
3
mv [OPTION] [-T] SOURCE DEST
mv [OPTION] SOURCE DIRECTORY
mv [OPTION] -t DIRECTORY SOURCE

参数

  • --backup[=CONTROL]: 对每个现有目标文件进行备份。
  • -b: 像--backup一样,但是不接受参数。
  • -f, --force: 若指定目录已有同名文件,覆盖前不提示。
  • -i, --interactive: 若指定目录已有同名文件,则先询问是否覆盖旧文件。
  • -n, --no-clobber: 若指定目录已有同名文件,不覆盖此文件。
  • --strip-trailing-slashes: 从每个源中删除所有结尾的斜杠。
  • -S, --suffix=SUFFIX: 指定要用于所有备份文件的文件名后缀SUFFIX,默认值为~
  • -t, --target-directory=DIRECTORY: 将所有源移动到目标目录中,此时目标目录在前,源文件在后。。
  • -T, --no-target-directory: 将目标视为普通文件,而不是目录。
  • -u, --update: 如果文件较新,则不会覆盖,仅当目标文件早于源文件或目标文件不存在时才会发生移动。
  • -v, --verbose: 提供详细的输出,打印每个移动文件的名称。
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

语法设置

命令格式运行结果
mv 文件名 文件名将源文件名改为目标文件名。
mv 文件名 目录名将文件移动到目标目录。
mv 目录名 目录名目标目录已存在,将源目录移动到目标目录,目标目录不存在则改名。
mv 目录名 文件名出错。

示例

file2.txt更名为file3.txt

1
mv file2.txt file3.txt

file.txt移动到var目录中。

1
mv file.txt /var/

dir目录改名为dirs

1
mv dir dirs

more命令

more命令类似less,以分页的形式浏览文件内容,在more命令退出后会在shell上留下操作的内容,在分页浏览时使用h键输出说明文件。

语法

1
more [options] [file]

参数

  • -d: 提示使用者,在画面下方显示[Press space to continue, 'q' to quit.],如果使用者按错键,则会显示[Press 'h' for instructions.]而不是滴声。
  • -f: 计算行数时,以实际上的行数,而非自动换行过后的行数,某些单行字数太长的会被扩展为两行或两行以上。
  • -l: 取消遇见特殊字元^L送纸字元时会暂停的功能。
  • -c: 不进行滚动而是从顶部绘制每个屏幕,清除每行显示的其余部分,跟-p相似,不同的是先显示内容再清除其他输出。
  • -p: 不以滚动的方式显示每一页,而是先清除输出后再显示内容。
  • -s: 当遇到有连续两行以上的空白行,就代换为一行的空白行。
  • -u: 不显示下划线,根据环境变数TERM指定的terminal而有所不同。
  • -<num>: 指定每屏的行数。
  • +<num>: 从第num行开始显示。
  • +/<str>: 在每个文档显示前搜寻字串str,然后从该字串之后开始显示。
  • -V: 显示版本信息。

常用操作

  • h or ?: 帮助菜单,显示命令的摘要。
  • SPACE: 显示接下来的k行文本,默认为当前屏幕尺寸。
  • Enter: 向下n行,需要定义,默认为1行。
  • Ctrl+F: 向下滚动一屏。
  • Ctrl+B: 返回上一屏。
  • =: 输出当前行的行号。
  • :f: 输出文件名和当前行的行号。
  • V: 调用vi编辑器。
  • ! <cmd>: 调用Shell,并执行命令。
  • q: 退出more命令。

示例

分页显示/var/log/ufw.log文件内容。

1
more /var/log/ufw.log

从第20行开始显示/var/log/ufw.log文件内容。

1
more +20 /var/log/ufw.log

1行分页显示/var/log/ufw.log文件内容。

1
more -1 /var/log/ufw.log

mktemp命令

mktemp命令用于安全地创建一个临时文件或目录,并输出其名称,TEMPLATE在最后一个组件中必须至少包含3个连续的X,如果未指定TEMPLATE,则使用tmp.XXXXXXXXXX作为名称在当前目录下创建相应的临时文件,X为生成的随机数,尾部的X将替换为当前进程号和随机字母的组合,文件的名称取决于模板中X的数量以及与现有文件冲突的数量,mktemp可以返回的唯一文件名的数量取决于所提供的X的数量,十个X将导致mktemp测试大约26**10个组合,mktemp命令创建的临时文件不会使用默认的umask管理权限值,其会将文件的读写权限分配给文件属主,一旦创建了文件,在shell脚本中就拥有了完整的读写权限,除root外其他人不可访问,即在创建文件时即有u+rw权限,创建文件夹时有u+rwx权限。

语法

1
mktemp [OPTION] [TEMPLATE]

参数

  • -d, --directory: 创建目录,而不是文件。
  • -u, --dry-run: 在mktemp退出之前,临时文件将被取消链接,相当于不创建任何文件或文件夹,仅输出名称,不建议使用该选项。
  • -q, --quiet: 执行时若发生错误,不会输出任何信息。
  • --suffix=SUFF: 将STUFF附加到TEMPLATESUFF不能包含斜线,如果TEMPLATE不以X结尾,则默认此选项。
  • -p <DIR>, --tmpdir <DIR>: 生成临时文件时使用指定的目录作为目标。
  • -t: 将目标文件存储在临时目录,该目录首先会选择用户的TMPDIR环境变量,其次是用户指定的-p参数选择的目录,最后的选择即/tmp目录,创建后会输出临时文件的全路径。
  • --help: 输出帮助选项。
  • --version: 输出版本信息。

示例

在当前目录创建临时文件。

1
2
mktemp tmp.XXX
# tmp.g6k

创建指定文件类型的临时文件。

1
2
mktemp tmp.XXX --suffix=.txt
# tmp.gSI.txt

在指定目录创建临时文件。

1
2
mktemp --tmpdir=/home tmp.XXX
# /home/tmp.HxB

mc命令

mc是一个基于字符的目录浏览器和文件管理器,其将熟悉的图形文件管理器和常见的命令行工具联系在一起,mc的设计基于文件管理器中双目录窗格的设计,其中同时显示两个目录的列表,可以执行所有常见的文件和目录操作,例如复制、移动、重命名、链接和删除等,也允许操纵文件和目录权限等操作。

语法

1
mc [option] [file]

参数

  • --configure-options: 打印配置选项。
  • -e, --edit=<file>: 以mc模式下编辑文件。
  • -f, --datadir: 打印数据目录。
  • -F, --datadir-info: 打印有关使用的数据目录的扩展信息。
  • -h, --help: 显示帮助。
  • --help-all: 显示所有帮助选项。
  • --help-terminal: 终端选项。
  • --help-color: 颜色选项。
  • -l, --ftplog=<file>: 将ftp对话框记录到指定文件。
  • -P, --printwd=<file>: 将最后一个工作目录打印到指定文件。
  • -u, --nosubshell: 禁用subshell支持。
  • -U, --subshell: 启用subshell支持,默认选项。
  • -v, --view=<file>: 在文件上启动文件查看器。

示例

启动Midnight Commander管理器。

1
mc

lsattr命令

lsattr命令用于显示文件的属性。

语法

1
lsattr [-RVadlv] [file | folder]

参数

  • -a: 显示所有文件和目录,包括以.为名称开头字符的额外内建,即现行目录.与上层目录..
  • -d: 显示目录名称,而非其内容。
  • -l: 指出要显示设备的逻辑名称。
  • -R: 递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v: 显示文件或目录版本。
  • -V: 显示版本信息。

文件属性

  • a: 使文件或目录仅供附加用途。
  • b: 不更新文件或目录的最后存取时间。
  • c: 将文件或目录压缩后存放。
  • d: 将文件或目录排除在倾倒操作之外。
  • i: 不得任意更动文件或目录。
  • s: 保密性删除文件或目录。
  • S: 即时更新文件或目录。
  • u: 预防意外删除。

示例

查看file.txt文件的属性。

1
lsattr file.txt

显示所有文件和目录的属性。

1
lsattr -a

递归处理将/tmp/目录下的所有文件及子目录一并处理。

1
lsattr -R /tmp/

look命令

look命令用于查询单词,仅需指定欲查询的字首字符串,它会显示所有开头字符串符合该条件的单词。

语法

1
look [-bdf] [-t char] string [file ...]

参数

  • -a, --alternative: 使用备用字典文件。
  • -d, --alphanum: 使用普通字典字符集和顺序,即只比较空格和字母数字字符。如果未指定文件,则默认情况下此选项处于启用状态。
  • -f, --ignore-case: 忽略字母字符的大小写,如果未指定文件,则默认情况下此选项处于启用状态。
  • -t, --terminate character: 指定一个字符串终止字符,即仅比较字符串中直到第一个出现的字符,包括第一个出现的字符。
  • -V, --version: 输出版本信息。
  • -h, --help: 输出帮助信息。

示例

使用look查找以ab开头的单词。

1
2
3
4
5
6
7
8
9
look ab
# Abbas
# Abbas's
# Abbasid
# Abbasid's
# Abbott
# Abbott's
# Abby
# ...

在文件中查找以L开头的单词并列出全句。

1
2
3
4
# file.txt
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
1
2
look L file.txt
Linux is a free unix-type opterating system.

在上述示例中使用-t指定字符串终止字符,即仅比较字符串中第一次出现之前(包括第一次出现)的字符。

1
2
look -t E HEO file.txt
# HELLO LINUX!

locate命令

locate命令用于查找符合条件的文件,其会去保存文件和目录名称的数据库内,查找符合指定条件的文件或目录,locate命令预设的数据库位于/var/lib/mlocate/mlocate.dblocatefind不同,find是去硬盘找,而locate只在数据库中查找,这个数据库中含有本地所有文件信息,Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件,可以主动执行updatedb命令以更新数据库。

语法

1
locate [OPTION] [PATTERN]

参数

  • -b, --basename: 仅将基本名称与指定的模式匹配。
  • -c, --count: 在标准输出上不输出文件名,而只输出匹配条目的数量。
  • -d, --database <DBPATH>: 用指定的数据库替换默认数据库,如果指定了多个--database选项,则结果路径是单独路径的串联,此外空数据库文件名将替换为默认数据库。
  • -e, --existing: 仅打印引用定位时存在的文件的条目。
  • -L, --follow: 在检查文件是否存在时,遵循尾随的符号链接,这会使将导致断开的符号链接从输出中省略,这是默认行为。
  • -h, --help: 在线帮助。
  • -i, --ignore-case: 匹配模式时忽略大小写区别。
  • -l, --limit, -n <LIMIT>: 找到LIMIT个条目后成功退出,如果指定了--count选项,则结果计数也将限制为LIMIT
  • -m, --mmap: 出于BSDGNU兼容性而被忽略。
  • -P, --nofollow, -H: 在检查文件是否存在时,不跟随尾随的符号链接,这会使断开的符号链接像其他文件一样被报告。
  • -0, --null: 使用ASCII NUL字符分隔输出上的条目,而不是将每个条目写在单独的行上,此选项旨在与GNU xargs--null选项互操作。
  • -S, --statistics: 将每个有关读取数据库的统计信息写入标准输出,而不是搜索文件并成功退出。
  • -q, --quiet: 不输出任何有关读取和处理数据库时遇到的错误的消息。
  • -r, --regexp <REGEXP>: 搜索基本的正则表达式,如果使用此选项,则不允许使用模式匹配,但可以多次指定此选项。
  • --regex: 将所有PATTERN解释为扩展的正则表达式。
  • -s, --stdio: 出于BSDGNU兼容性而被忽略。
  • -V, --version: 输出版本信息。
  • -w, --wholename: 将整个路径名与指定的模式匹配,这是默认行为。

示例

查找file.txt文件。

1
locate file.txt

输出匹配file.txt文件名的数量。

1
locate -c file.txt

匹配以make结尾的文件。

1
locate -r make$

ln命令

ln命令用来为文件创建链接,链接类型分为硬链接和软链接两种,软链接又称符号链接,默认的链接类型是硬链接,如果要创建符号链接必须使用-s选项,符号链接文件不是一个独立的文件,其很多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

语法

1
ln [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [--help] [...] [origin] [target]

参数

  • -b, --backup: 删除,覆盖目标文件之前的备份。
  • -d, -F, --directory: 建立目录的硬链接。
  • -f, --force: 强行建立文件或目录的链接,不论文件或目录是否存在。
  • -i, --interactive: 覆盖既有文件之前先询问用户。
  • -n, --no-dereference: 把符号链接的目的目录视为一般文件。
  • -s, --symbolic: 对源文件建立符号链接,而非硬链接。
  • -S <backup-suffix>, --suffix=<backup-suffix>: 用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号~,用户可通过-S参数来改变它。
  • -v, --verbose: 显示指令执行过程。
  • -V <backup method>, --version-control=<backup method>: 用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用-S参数变更,当使用-V参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串。
  • --help: 在线帮助。
  • --version: 显示版本信息。

链接方式

软链接

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

硬链接

  • 硬链接,以文件副本的形式存在,但不占用实际空间。
  • 不允许给目录创建硬链接。
  • 硬链接只有在同一个文件系统中才能创建。

示例

file.txt创建软链接filesoftlink

1
ln -s file.txt filesoftlink

file.txt创建硬链接filehardlink

1
ln file.txt filehardlink

显示版本信息。

1
ln --version

less命令

less命令的作用与more相似,都可以用来浏览文件的内容,用less命令显示文件时,使用pageup键向上翻页,使用pagedown键向下翻页,使用按行浏览,使用q退出浏览,less在加载时不必读整个文件,加载速度会比more更快,less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容。

语法

1
less [option] [file]

参数

  • -b <buffer size>: 设置缓冲区的大小。
  • -e: 当文件显示结束后,自动离开。
  • -f: 强迫打开特殊文件,例如外围设备代号、目录和二进制文件。
  • -g: 只标志最后搜索的关键词。
  • -i: 忽略搜索时的大小写。
  • -m: 显示类似more命令的百分比。
  • -N: 显示每行的行号。
  • -o <file>: 将less输出的内容在指定文件中保存起来。
  • -Q: 不使用警告音。
  • -s: 显示连续空行为一行。
  • -S: 行过长时将超出部分舍弃。
  • -x <num>: 将tab键显示为规定的数字空格。

常用操作

  • ctrl + F: 向前移动一屏。
  • ctrl + B: 向后移动一屏。
  • ctrl + D: 向前移动半屏。
  • ctrl + U: 向后移动半屏。
  • j: 向前移动一行
  • k: 向后移动一行
  • /string: 向下搜索字符串的功能。
  • ?string: 向上搜索字符串的功能。
  • n: 重复前一个搜索,与/?有关。
  • N: 反向重复前一个搜索,与/?有关。
  • b: 向上翻一页。
  • d: 向后翻半页。
  • h: 显示帮助界面。
  • Q: 退出less命令。
  • u: 向前滚动半页。
  • y: 向前滚动一行。
  • space: 滚动一页。
  • enter: 滚动一行。
  • pageup: 向上翻动一页。
  • pagedown: 向下翻动一页。
  • G: 移动到最后一行。
  • g: 移动到第一行。
  • q / ZZ: 退出less命令。
  • v: 使用配置的编辑器编辑当前文件。
  • h: 显示less的帮助文档。
  • &pattern: 仅显示匹配模式的行,而不是整个文件。
  • ma: 使用a标记文本的当前位置。
  • a: 导航到标记a处。

示例

浏览file.txt文件。

1
less file.txt

ps查看进程信息并通过less分页显示。

1
ps -ef | less

查看file.txt文件并检索向后检索1字符串。

1
2
less file.txt 
/1

kill命令

kill命令向指定的pid进程发送信号,如果不指定要发送的signal信号,则默认情况下signalSIGTERM,它会终止进程,要列出所有可用信号,可以使用-l选项获取Linux信号列表,经常使用的信号包括HUPINTKILLSTOPCONT0,可以通过三种方式指定信号: 按数字例如-9,带有SIG前缀例如-SIGKILL,不带SIG前缀例如-KILL。负PID值用于指示过程组ID,如果传递了进程组ID,则该组中的所有进程都将接收到该信号,PID-1是特殊的,其指示除两个以外的所有进程,kill进程本身和initPID 1,其是系统上所有进程的父进程,将-1指定为目标会将信号发送到除这两个以外的所有进程。

语法

1
2
3
kill pid ...
kill {-signal | -s signal} pid ...
kill {-l | --list[=signal] | -L | --table}

参数

  • -signal, -s signal: 要发送的信号的名称、缩写名或编号,前面有破折号,例如-SIGTERM-TERM-15等,要查看可用信号的列表可以使用kill -l
  • pid: 数字进程ID,如果不确定某个进程的PID是什么,可以使用ps命令将其列出例如ps -aux,通常会配合管道与grep使用例如查看nginx相关的进程ps -aux | grep nginx
  • -l, --list[=signal]: 列出可用的信号名称,用-l--list列出所有信号名称,使用--list = signal,可将数字转换为其信号名称。
  • -L, --table: 在表格中列出可用的信号名称和编号。

信号

下列的某些信号是不能使用的,因为系统有可能不支持这些信号,或者这些信号已中断,详情可以实际查阅系统的kill -l命令。每个系统都有信号13915,这些是最常见的信号。终止信号不仅用于关闭锁定的应用程序,还可以阻止软件执行不允许的任务,这意味着其中一些终止信号是安全的一部分,另外kill命令不仅停止/终止进程,而且还暂停,继续和重新启动进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
  • SIGHUP: SIGHUP信号用于断开进程与父进程的连接,这也可以用于重新启动进程,这对于内存泄漏的守护程序很有用。
  • SIGINT: 该信号与按Ctrl+C相同,在某些系统上delete + break会向进程发送相同的信号,该进程被中断并停止,但是该进程自身可以忽略此信号。
  • SIGQUIT: 这类似于SIGINT,但由于QUIT字符通常是由Ctrl+\来控制,进程在收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
  • SIGILL: 当一个进程执行一个错误的、禁止的或未知的功能时,系统向该进程发送SIGILL信号,这是代表非法操作的信号。
  • SIGTRAP: 此信号用于调试目的,当某个进程执行了某个操作或满足了调试器正在等待的条件时,此信号将被发送到该进程。
  • SIGABRT: 该终止信号是中止信号,通常进程会在自身上发出此终止信号。
  • SIGBUS: 当一个进程被发送SIGBUS信号时,是因为该进程导致了一个总线错误,通常这些总线错误是由于进程试图使用假物理地址或进程的内存对齐设置不正确造成的。
  • SIGFPE: 被零除的进程使用SIGFPE终止。
  • SIGKILL: SIGKILL信号强制进程立即停止执行,程序不能忽略该信号,此过程也无法清除。
  • SIGUSR1: 这表示用户定义的条件,用户可以通过在sigusr1.c中编程命令来设置此信号。
  • SIGSEGV: 当应用程序有分段冲突时,这个信号被发送到进程。
  • SIGUSR2: 这表示用户定义的条件。
  • SIGPIPE: 当进程尝试写入缺少与读取器连接的一端的管道时,此信号将发送到进程,读取器是在管道末端读取数据的过程。
  • SIGALRM: 当实时或时钟计时器到期时,将发送SIGALRM
  • SIGTERM: 该信号请求进程停止运行,该信号可以被程序自身忽略,该过程有时间正常关闭,当程序正常关闭时,这意味着它有时间保存进度并释放资源,换句话说即它不被迫停止。
  • SIGCHLD: 当父进程丢失其子进程时,将向父进程发送SIGCHLD信号,这将清理子进程使用的资源,子进程指的是由另一个称为父进程的进程启动的进程。
  • SIGCONT: 要使进程在被SIGTSTPSIGSTOP信号暂停后继续执行,需要将SIGCONT信号发送到已暂停的进程,这是CONTiNUE SIGNAL,该信号对Unix作业控制执行后台任务很有帮助。
  • SIGSTOP: 该信号使操作系统暂停进程的执行,进程自身不能忽略该信号。
  • SIGTSTP: 这个信号类似于按下Ctrl+Z,它向包含进程的终端发出请求,请求进程暂时停止,进程自身可以忽略该信号。
  • SIGTTIN: 当进程试图从tty终端读取数据时,进程接收到这个信号。
  • SIGTTOU: 当某个进程尝试向tty终端进行写操作时,该进程将收到此信号。
  • SIGURG: 当进程中有紧急数据要读取或数据非常大时,SIGURG信号将发送到该进程。
  • SIGXCPU: 当某个进程在分配的时间之后使用CPU时,系统将向该进程发送该信号,SIGXCPU的行为就像一个警告,该进程有时间保存进度(如果可能)并在系统使用SIGKILL终止该进程之前将其关闭。
  • SIGXFSZ: 文件系统对文件的大小有限制,当程序尝试违反此限制时,系统将发送该过程SIGXFSZ信号。
  • SIGVTALRM: SIGVTALRM在进程使用的CPU时间结束时发送。
  • SIGPROF: 当进程以及由系统代表进程使用的CPU时间过去时,将发送SIGPROF信号。
  • SIGWINCH: 当进程在更改其大小的终端中时,该进程将接收此信号。
  • SIGIO: SIGPOLL的别名或至少表现得很像SIGPOLL
  • SIGPWR: 电源故障将导致系统将该信号发送到进程,如果系统仍在运行。
  • SIGSYS: 为系统调用提供无效参数的进程将接收此信号。
  • SIGRTMIN*: 这是一组在系统之间变化的信号,它们被标记为SIGRTMIN + 1SIGRTMIN + 2SIGRTMIN + 3...,通常最多15个,这些是用户定义的信号,它们必须在Linux内核的源代码中进行编程。
  • SIGRTMAX*: 这是一组在系统之间变化的信号,它们被标记为SIGRTMAX-1SIGRTMAX-2SIGRTMAX-3...,通常最多14个,这些是用户定义的信号,它们必须在Linux内核的源代码中进行编程。
  • SIGEMT: 指示一个实现定义的硬件故障。
  • SIGINFO: 终端有时可能会向进程发送状态请求,发生这种情况时,进程也将收到此信号。
  • SIGLOST: 试图访问锁定文件的进程将收到此信号。
  • SIGPOLL: 当进程引起异步I/O事件时,会向该进程发送SIGPOLL信号。

示例

要显示所有可用信号,查看信号的详细信息可以使用man命令,例如信号7 SIGBUS即使用man 7 signal

1
kill -l

在表格中列出可用的信号名称和编号。

1
kill -L

终端断线,重新加载配置文件,平滑重启。

1
kill -1 111

通知进程关闭,使进程自行关闭,这个关闭是安全、干净地退出,如果kill命令后直接加进程的pid号默认选项为-15,这个信号是可以被进程自身忽略并继续执行自身的,即该信号是可以被阻塞和忽略的。

1
kill -15 111

强行中断当前程序的执行,类似Ctrl+C按键用以结束进程的结果,该信号是可以被阻塞和忽略的。

1
kill -2 111

退出进程,类似Ctrl+\按键用以结束进程的结果,该信号是可以被阻塞和忽略的。

1
kill -3 111

强行关闭进程,-9信号是无条件终止,这个信号不能被捕获或忽略,同时接收这个信号的进程在收到这个信号时不能执行任何清理,该信号是不可以被阻塞和忽略的,当然通常是不建议使用kill -9的,应该尝试使用-15以及-2给目标进程一个清理自身资源工作的机会,不要用收割机来修剪花盆里的花。

1
kill -9 111

暂停进程,对于暂停信号进程自身不能忽略该信号。

1
kill -19 111 

激活进程,对于激活信号必须发送到已暂停的进程才有效。

1
kill -18 111