Linux常用命令--下

journalctl命令

journalctl命令是Systemd日志系统的一个命令,主要用途是用来查看通过Systemd日志系统记录的日志,在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd取代了initd之后便开始统一管理了所有Unit的启动日志,可以只用一个journalctl命令,查看所有内核和应用的日志。

语法

1
journalctl [OPTIONS...] [MATCHES...]

参数

  • --no-full, --full, -l: 当字段匹配可用列时将其省略,默认设置是显示完整字段,允许它们换行或被截断,旧的选项-l/--full不再有用,除了撤销--no-full
  • -a, --all: 完整显示所有字段,即使它们包含不可打印字符或非常长。
  • -f, --follow: 仅显示最近的日志条目,并在新条目附加到日志时连续打印。
  • -e, --pager-end: 立即跳到日志的结尾内隐含的工具,这意味着-n 1000可以保证分页器不会缓冲大小不受限制的日志,可以在命令行中使用显式的-n和其他一些数值来覆盖它,注意,这个选项只支持less页。
  • -n, --lines=: 显示最近的日志事件并限制显示的事件数,如果使用--follow,则隐含此选项,参数为正整数,是可选的,默认为10
  • --no-tail: 显示所有存储的输出行,即使在follow模式下也是如此,撤消--line=的效果。
  • -r, --reverse: 反转输出,以便首先显示最新的条目。
  • -o, --output=: 控制所显示的日志条目的格式,采用以下选项之一:
    • short: 默认值,并生成与经典syslog文件格式基本相同的输出,每个日志条目显示一行。
    • short-iso: 与short非常相似,但显示ISO 8601 wallclock时间戳。
    • short-precise: 与short非常相似,但是以微秒的精度显示时间戳。
    • short-monotonic: 非常相似,但是显示的是monotonic的时间戳,而不是wallclock的时间戳。
    • verbose: 显示具有所有字段的完整结构条目。
    • export: 将日志序列化成适合备份和网络传输的二进制流,主要是基于文本的。
    • json: 将条目格式化为JSON数据结构,每行一个。
    • json-pretty: 将条目格式化为JSON数据结构,但将它们格式化为多行,以使人们更容易阅读。
    • json-sse: 将条目格式化为JSON数据结构,但将它们包装为适合服务器发送的Eventsm的格式。
    • cat: 生成一个非常简洁的输出,只显示每个日志条目的实际消息,没有元数据,甚至没有时间戳。
  • -x, --catalog: 用来自消息目录的解释文本扩充日志行,这将向输出中可用的日志消息中添加解释性帮助文本,这些简短的帮助文本将解释错误或日志事件的上下文、可能的解决方案,以及指向支持论坛、开发人员文档和任何其他相关手册的指针,注意,帮助文本不是对所有消息都可用,而是仅对选定的消息可用。此外,将journalctl输出附加到错误报告时,请不要使用-x
  • -q, --quiet: 当以普通用户身份运行时,禁止显示有关不可访问的系统日志的任何警告消息。
  • -m, --merge: 显示所有可用的日志,包括远程日志的交叉条目。
  • -b [ID][±offset], --boot=[ID][±offset]: 显示来自特定启动的消息,这将为_BOOT_ID=添加匹配项,参数可能为空,在这种情况下,将显示当前引导的日志,如果省略引导ID,则正偏移量将查找从日志开始的引导,而等于或小于零的偏移量将查找从日志结束的引导,因此,1表示按时间顺序在日志中找到的第一个引导,2表示第二个引导,依此类推,而-0表示最后一个引导,-1表示最后一个引导之前的引导,依此类推,空偏移量等同于指定-0,除非当前引导不是最后一次引导,例如因为指定--directory查看来自不同计算机的日志。如果指定了32个字符的ID,则可以选择后跟偏移量,该偏移量标识相对于boot ID给定的引导,负值表示较早的引导,正值表示较晚的引导,如果未指定offset,则假定值为零,并显示ID给定的引导日志。
  • --list-boots: 显示引导编号(相对于当前引导)、它们的id以及与引导相关的第一条和最后一条消息的时间戳的列表。
  • -k, --dmesg: 只显示内核消息,这意味着-b并添加匹配_TRANSPORT=kernel
  • -u, --unit=UNIT|PATTERN: 显示指定的systemd单元单元的消息,或任何与PATTERN匹配的单元的消息,如果指定了模式,日志中找到的单元名称列表将与指定的模式进行比较,并使用所有匹配的内容,对于每个单元名,将为来自该单元的消息添加一个匹配_SYSTEMD_UNIT= unit,以及来自systemd的消息和关于指定单元的coredumps的消息的额外匹配,该参数可以指定多次。
  • --user-unit=: 显示指定用户会话单元的消息,这将为来自单元的消息_SYSTEMD_USER_UNIT=_UID=添加匹配,并为来自会话systemd的消息和关于指定单元的coredumps的消息添加额外匹配,该参数可以指定多次。
  • -p, --priority=: 根据消息优先级或优先级范围筛选输出,接受单个数字或文本日志级别(即在0 emerg7 debug之间),或以..形式表示的numeric/text日志级别范围,日志级别是syslog中记录的通常的syslog日志级别,即emerg 0alert 1crit 2err 3warning 4notice 5info 6debug 7,如果指定一个日志级别,则显示该级别或更低(值更低优先级更高)日志级别的所有消息,如果指定了一个范围,则将显示该范围内的所有消息,包括该范围的开始值和结束值,这将为指定的优先级添加PRIORITY=匹配项。
  • -c, --cursor=: 从传递的游标指定的日志位置开始显示条目。
  • --after-cursor=: 从该光标指定的位置之后的日志位置开始显示条目,使用--show-cursor选项时将显示光标。
  • --show-cursor: 光标显示在最后一项的两个破折号后,类似于-- cursor: s=0639...,光标的格式是私有的,可能会更改。
  • --since=, --until=: 分别在指定日期或更新日期,或在指定日期或更新日期开始显示条目,日期规范的格式应该是2012-10-30 18:17:16,如果省略了时间部分,则假定为00:00:00,如果只省略了seconds组件,则假定为:00,如果省略了date部分,则假定为当前日期,或者理解字符串yesterdaytodaytomorrow,分别表示当前日期的前一天00:00:00、当前日期的前一天00:00:00、当前日期的后一天,now指的是当前时间,最后,可以指定相对次数,以-+作为前缀,分别表示当前时间之前或之后的次数。
  • -F, --field=: 在日志的所有条目中打印指定字段可以接受的所有可能数据值。
  • --system, --user: 显示来自系统服务和内核的消息(使用--system),显示来自当前用户服务的消息(使用--user),如果两者都未指定,则显示用户可以看到的所有消息。
  • -M, --machine=: 显示来自运行中的本地容器的消息,指定要连接的容器名称。
  • -D DIR, --directory=DIR: 以目录路径作为参数,如果指定,journalctl将操作指定的日志目录DIR,而不是默认的运行时和系统日志路径。
  • --file=GLOB: 以文件glob作为参数,如果指定,journalctl将操作与GLOB匹配的指定日志文件,而不是默认的运行时和系统日志路径,可以指定多次,在这种情况下文件将被适当地交错。
  • --root=ROOT: 以目录路径作为参数,如果指定,journalctl将对指定目录下的目录文件层次结构而不是根目录进行操作,例如--update catalog将创建root/var/lib/systemd/catalog/database
  • --new-id128: 生成一个新的适合标识消息的128ID,而不是显示日志内容,这是为那些需要为他们引入的新消息使用新标识符并希望使其可识别的开发人员准备的,这将以三种不同的格式打印新的ID,这些格式可以复制到源代码或类似的文件中。
  • --header: 不是显示日志内容,而是显示所访问日志字段的内部头信息。
  • --disk-usage: 显示所有日志文件的当前磁盘使用情况。
  • --list-catalog [128-bit-ID...]: 以消息id表的形式列出消息目录的内容,以及它们的简短描述字符串,如果指定了任何128id,则只显示那些条目。
  • --dump-catalog [128-bit-ID...]: 显示消息目录的内容,条目由由两个破折号和ID组成的行分隔,格式与.catalog文件相同,如果指定了任何128id,则只显示那些条目。
  • --update-catalog: 更新消息目录索引,每次安装、删除或更新新的编目文件以重新生成二进制编目索引时,都需要执行此命令。
  • --setup-keys: 生成一个用于前向安全密封FSS的新密钥对,而不是显示日志内容,这将生成一个密封密钥和一个验证密钥,密封密钥存储在日志数据目录中,并保留在主机上,验证键应该存储在外部。
  • --force: 当传递了--setup keys并且已经配置了前向安全密封FSS时,重新创建FSS keys
  • --interval=: 指定使用--setup-keys生成FSS密钥对时密封密钥的更改间隔,较短的时间间隔会增加CPU消耗,但会缩短无法检测到的日志更改的时间范围,默认为15分钟。
  • --verify: 检查日志文件的内部一致性,如果文件是在启用FSS的情况下生成的,并且FSS验证密钥是用--verify key=指定的,则会验证日志文件的真实性。
  • --verify-key=: 指定用于--verify操作的FSS验证密钥。
  • --no-pager: 不将程序的输出内容管道pipe给分页程序。
  • --vacuum-size=BYTES: 将磁盘使用减少到指定大小以下。
  • --vacuum-files=INT: 仅保留指定数量的日记文件。
  • --vacuum-time=TIME: 任何早于指定时间点的条目都将被删除。
  • --rotate: 要求日志守护进程滚动日志文件,此命令会一直阻塞到滚动操作完成之后才会返回,日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,同时新的空白日志文件将被创建,并成为新的活动日志文件,通常可以与--vacuum-size=--vacuum-time=--vacuum-file=一起使用, 以提高日志清理的效率。
  • -h, --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

显示本次启动以来的全部日志。

1
journalctl

显示内核日志。

1
journalctl -k

使用-n参数可以显示最后n行日志,如果不指定行数,默认显示10行。

1
journalctl -n 20

查看指定进程的日志。

1
journalctl _PID=1

显示最近30分钟的日志。

1
journalctl --since=-30m

显示2021年以来的日志。

1
journalctl --since="2021-01-01"

显示今天的日志。

1
journalctl --since=today

使用-f参数可以实现类型tail -f的功能,持续监控最新的日志。

1
journalctl -f

查看指定Unit的日志。

1
journalctl -u nginx.service

查看日志占用的磁盘空间。

1
journalctl --disk-usage

要求日志守护进程滚动日志文件,日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,同时新的空白日志文件将被创建,并成为新的活动日志文件。

1
journalctl --rotate

清理一个周前的日志。

1
journalctl --vacuum-time=1week

将磁盘占用减少到指定大小以下。

1
journalctl --vacuum-size=10M

join命令

join命令用于将两个文件中,指定栏位内容相同的行连接起来。其首先找出两个文件中指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

语法

1
join [OPTION]... FILE1 FILE2

参数

  • -a FILENUM: 从FILENUM打印不成对的行,其中FILENUM12,对应于FILE1FILE2
  • -e EMPTY: 将缺少的输入字段替换为空。
  • -i, --ignore-case: 比较字段时忽略大小写的差异。
  • -j FIELD: 相当于-1 FIELD -2 FIELD
  • -o FORMAT: 构造输出线时遵守FORMAT
  • -t CHAR: 使用CHAR作为输入和输出字段分隔符。
  • -v FILENUM: 类似于-a FILENUM,但不连接输出行。
  • -1 FIELD: 加入文件1的这个FIELD
  • -2 FIELD: 加入文件2的这个FIELD
  • --check-order: 检查输入是否正确排序,即使所有输入行都可以配对。
  • --nocheck-order: 不要检查输入是否正确排序。
  • --header: 将每个文件的第一行视为字段标题,无需尝试将它们配对即可打印它们。
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

示例

file1.txtfile2.txt文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
# file1.txt
1 AAYUSH
2 APAAR
3 HEMANT
4 KARTIK
5 TIM

# file2.txt
1 101
2 102
3 103
4 104

使用join命令合并文件,为了合并两个文件,文件必须具有一些公共字段,此时两个文件中的公共字段均带有编号1、2...

1
2
3
4
5
join file1.txt file2.txt
# 1 AAYUSH 101
# 2 APAAR 102
# 3 HEMANT 103
# 4 KARTIK 104

使用-a选项打印FILE1中已成对的行并链接以及不成对的行。

1
2
3
4
5
6
7
join file1.txt file2.txt -a 1
# 1 AAYUSH 101
# 2 APAAR 102
# 3 HEMANT 103
# 4 KARTIK 104
# 5 TIM

使用-v选项打印FILE1中不成对的行。

1
2
join file1.txt file2.txt -v 1
# 5 TIM

join会在第一个公共字段上组合文件行,该字段是默认值。但是这两个文件中的公共值不一定总是第一个列,所以join可以使用-1, -2指定公共值位置。-1-2表示第一个和第二个文件,这些选项需要一个数字参数,该参数引用相应文件的连接字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
`file1.txt`与`file2.txt`文件内容如下:
# file1.txt
AAYUSH 1
APAAR 2
HEMANT 3
KARTIK 4
TIM 5

# file2.txt
101 1
102 2
103 3
104 4
1
2
3
4
5
join -1 2 -2 2 file1.txt file2.txt
# 1 AAYUSH 101
# 2 APAAR 102
# 3 HEMANT 103
# 4 KARTIK 104

对于上面的示例,我们直接使用-j参数也可以实现。

1
2
3
4
5
join -j 2 file1.txt file2.txt
# 1 AAYUSH 101
# 2 APAAR 102
# 3 HEMANT 103
# 4 KARTIK 104

ip命令

ip命令与ifconfig命令类似,但比ifconfig命令更加强大,主要功能是用于显示或设置网络设备、路由和隧道的配置等,ip命令是Linux加强版的的网络配置工具,用于代替ifconfig命令。

语法

1
2
3
4
5
6
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename

OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm | netns }

OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }

参数

OPTIONS

  • -b, -batch <FILENAME>: 从提供的文件或标准输入读取命令并调用它们,第一次失败将导致ip执行终止。
  • -force: 不要在批处理模式下因错误而终止ip,如果在执行命令期间发生任何错误,则应用程序返回码将为非零。
  • -s, -stats, -statistics: 输出更多信息,如果该选项出现两次或更多次,则信息量会增加,通常,信息是统计信息或一些时间值。
  • -l, -loops <COUNT>: 指定ip addr flush逻辑在放弃之前尝试的最大循环数,默认值为100表示循环直到删除所有地址。
  • -f, -family <FAMILY>: 指定使用的协议族,协议族标识符可以是inetinet6bridgeipxdnetlink中的一个,如果该选项不存在,则根据其他参数猜测协议族,如果命令行的其余部分没有提供足够的信息来猜测家族,ip将退回到默认的ip设置,通常是inetanylink是一种特殊的族标识符,不涉及任何网络协议。
  • -4: -family inet的快捷方式。
  • -6: -family inet6的快捷方式。
  • -B: -family bridge的快捷方式。
  • -D: -family decnet的快捷方式。
  • -I: -family ipx的快捷方式。
  • -0: -family link的快捷方式。
  • -o, -oneline: 将每条记录输出为一行,用\字符替换换行符,当使用wc计数记录或grep输出时,这很方便。
  • -r, -resolve: 使用系统的名称解析程序打印DNS名称而不是主机地址。
  • -V, -Version: 输出版本信息。

OBJECT

  • address: 设备上的协议地址,IPIPv6
  • addrlabel: 用于协议地址选择的标签配置。
  • l2tp: IP隧道以太网L2TPv3
  • link: 网络设备。
  • maddress: 多播地址。
  • monitor: 监视netlink消息。
  • mroute: 多播路由缓存项。
  • mrule: 多播路由策略数据库中的规则。
  • neighbour: 管理ARPNDISC缓存项。
  • netns: 管理网络名称空间。
  • ntable: 管理邻居缓存的操作。
  • route: 路由表条目。
  • rule: 路由策略数据库中的规则。
  • tcp_metrics/tcpmetrics: 管理TCP指标。
  • tunnel: IP隧道。
  • tuntap: 管理TUN/TAP设备。
  • xfrm: 管理IPSec策略。

示例

查看网络接口信息,例如IP地址,子网等。

1
ip addr show

要查看eth0网卡信息。

1
ip addr show eth0

启用网络接口。

1
ip link set eth0 up

关闭网络接口。

1
ip link set eth0 down

查看路由和默认网关信息。

1
ip route show

获取到特定ip的路由信息。

1
ip route get to 192.168.111.111

查看arp条目。

1
ip neigh

查看网络统计。

1
ip -s link

查看详细帮助信息。

1
man ip

ifconfig命令

ifconfig代表interface configuration,其用于查看和更改系统上网络接口的配置。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]
[add <address>[/<prefixlen>]]
[del <address>[/<prefixlen>]]
[[-]broadcast [<address>]] [[-]pointopoint [<address>]]
[netmask <address>] [dstaddr <address>] [tunnel <address>]
[outfill <NN>] [keepalive <NN>]
[hw <HW> <address>] [mtu <NN>]
[[-]trailers] [[-]arp] [[-]allmulti]
[multicast] [[-]promisc]
[mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]
[txqueuelen <NN>]
[[-]dynamic]
[up|down] ...

参数

  • (none), -a: 显示所有网络接口的信息,即使它们已关闭。
  • -s: 以与命令netstat -i相同的格式显示简短列表。
  • -v: 详细模式,显示某些错误情况的详细信息。
  • interface: 接口名称,通常是驱动程序名称,后跟一个单元号,例如第一个以太网接口的eth0,如果内核支持别名接口,则可以为eth0的第一个别名使用eth0:0指定它们,可以使用它们来分配第二个地址,要删除别名接口,可以使用ifconfig eth0:0 down,注意如果删除第一个(主接口),则对于每个范围即具有地址/网络掩码组合的同一网络,所有别名都将被删除。
  • up: 该标志导致接口被激活,如果为接口分配了地址,则隐式指定。
  • down: 该标志导致该接口的驱动程序被关闭。
  • [-]arp: 在此接口上启用(指定了-前缀则禁用)ARP协议的使用。
  • [-]promisc: 启用(指定了-前缀则禁用)接口的混杂模式,如果启用混杂模式,接口将接收网络上的所有数据包。
  • [-]allmulti: 启用(指定了-前缀则禁用)全组播模式,启用组播模式后,该接口将接收网络上所有的组播报文。
  • metric N: 此参数设置接口度量,接口使用该度量做出路由决策,N必须是介于04294967295之间的整数。
  • mtu N: 该参数用于设置接口的最大传输单元,该设置用于限制接口传输的最大数据包大小。
  • dstaddr address: 为点到点链路(如PPP)设置远程IP地址,此关键字现在已过时,请改用pointopoint关键字。
  • netmask address: 设置接口的IP网络掩码,该值默认为通常的ABC类网络掩码(从接口IP地址派生),但它可以设置为任何值。
  • add address/prefixlen: 在接口上添加IPv6地址。
  • del address/prefixlen: 从接口移除IPv6地址。
  • tunnel aa.bb.cc.dd: 创建一个新的SIT (IPv6-in-IPv4)设备,通过隧道传送到给定的目的地。
  • irq address: 设置此设备使用的中断线,并非所有设备都可以动态更改其IRQ设置。
  • io_addr address: 在此设备的I/O空间中设置起始地址。
  • mem_start address: 设置此设备使用的共享内存的起始地址,仅少数设备需要此功能。
  • media type: 设置设备要使用的物理端口或介质类型,并非所有设备都可以更改此设置,并且某些设备可以更改其支持的值,类型的典型值是10base2(细缆网)、10baseT(双绞线10 Mbps以太网)、AUI外部收发器等,auto的特殊介质类型告诉驱动程序自动感知介质,同样并非所有驱动程序都可以执行此操作。
  • [-]broadcast [address]: 如果指定了地址参数,则将为此接口设置协议广播地址,否则它将设置(指定了-前缀则清除)接口的IFF_BROADCAST标志。
  • [-]pointopoint [address]: 这个关键字启用了接口的点对点模式,这意味着它是两台机器之间的直接链接,没有其他人监听它,如果还提供了address参数,请设置链接另一端的协议地址,就像过时的dstaddr关键字一样,否则,设置或清除接口的IFF POINTOPOINT标志。
  • hw class address: 如果设备驱动程序支持此操作,则设置此接口的硬件地址,关键字之后必须是硬件类的名称以及与硬件地址等效的可打印ASCII。当前支持的硬件类别包括以太ether (Ethernet)ax25 (AMPR AX.25)ARCnet and netrom (AMPR NET/ROM)
  • multicast: 在接口上设置多播标志,由于驱动程序自己会正确设置该标志,因此通常不需要这样做。
  • address: 分配给该接口的IP地址。
  • txqueuelen length: 设置设备发送队列的长度,对于具有较高延迟的较慢设备(例如通过调制解调器或ISDN进行的连接)将其设置为较小的值非常有用,以防止快速的批量传输过多地干扰诸如telnet之类的交互式通信。

硬体类型

loop (Local Loopback)slip (Serial Line IP)cslip (VJ Serial Line IP)slip6 (6-bit Serial Line IP)cslip6 (VJ 6-bit Serial Line IP)adaptive (Adaptive Serial Line IP)ash (Ash)ether (Ethernet)ax25 (AMPR AX.25)netrom (AMPR NET/ROM)rose (AMPR ROSE)tunnel (IPIP Tunnel)ppp (Point-to-Point Protocol)hdlc ((Cisco)-HDLC)lapb (LAPB)arcnet (ARCnet)dlci (Frame Relay DLCI)frad (Frame Relay Access Device)sit (IPv6-in-IPv4)fddi (Fiber Distributed Data Interface)hippi (HIPPI)irda (IrLAP)ec (Econet)x25 (generic X.25)eui64 (Generic EUI-64)

地址族

unix (UNIX Domain)inet (DARPA Internet)inet6 (IPv6)ax25 (AMPR AX.25)netrom (AMPR NET/ROM)rose (AMPR ROSE)ipx (Novell IPX)ddp (Appletalk DDP)ec (Econet)ash (Ash)x25 (CCITT X.25)

示例

显示网络设备信息。

1
ifconfig

启动关闭指定网卡。

1
2
ifconfig eth0 down
ifconfig eth0 up

为网卡配置和删除IPv6地址。

1
2
ifconfig eth0 add 33ffe:3240:800:1005::2/ 64
ifconfig eth0 del 33ffe:3240:800:1005::2/ 64

修改MAC地址,需要首先关闭网卡并修改MAC地址,之后再开启网卡。

1
2
ifconfig eth1 hw ether 00:1D:1C:1D:1E
ifconfig eth1 up

为网卡配置IP地址,并加上子掩码以及广播地址。

1
ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255

启用和关闭ARP协议。

1
2
ifconfig eth0 arp
ifconfig eth0 -arp

设置最大传输单元MTU

1
ifconfig eth0 mtu 1500 

grep命令

grep命令用于查找文件里符合条件的字符串,如果发现某文件的内容符合所指定的模式,grep命令会把含有模式的那一行显示出来。若不指定任何文件名称,或是所给予的文件名为-,则grep指令会从标准输入设备读取数据。

语法

1
grep [OPTION]... PATTERN [FILE]...

参数

  • -A NUM, --after-context=NUM: 在匹配行之后打印尾部上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -a, --text: 像处理文本一样处理二进制文件,这相当于--binary files=text选项。
  • -B NUM, --before-context=NUM: 在匹配行之前打印前导上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -C NUM, --context=NUM: 打印输出上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -b, --byte-offset: 打印输入文件中每行输出之前的字节偏移量。
  • --binary-files=TYPE: 如果文件的前几个字节指示该文件包含二进制数据,则假定该文件为类型类型。默认情况下,TYPEbinarygrep通常输出一行消息,说明二进制文件匹配,或者不输出消息(如果不匹配)。如果TYPE不匹配,grep假设二进制文件不匹配,这相当于-I选项。如果TYPEtextgrep会像处理文本一样处理二进制文件,这相当于-a选项。此外grep--binary files=text可能会输出二进制垃圾,如果输出是终端,并且终端驱动程序将其中的一些解释为命令,则会产生严重的副作用。
  • --colour[=WHEN], --color[=WHEN]: 在匹配字符串周围加上标记find in GREP_COLOR环境变量,WHEN可以是neveralwaysauto
  • -c, --count: 禁止正常输出,而是为每个输入文件打印匹配行的计数,使用-v,--invert match选项,计算不匹配的行数。
  • -D ACTION, --devices=ACTION: 如果输入文件是设备、FIFO或套接字,使用ACTION来处理它。默认情况下,ACTIONread,这意味着设备的读取就像它们是普通文件一样,如果ACTIONskip,则设备将自动跳过。
  • -d ACTION, --directories=ACTION: 如果输入文件是目录,使用ACTION来处理它。默认情况下,ACTIONread,这意味着目录的读取就像它们是普通文件一样,如果ACTIONskip,则目录将被自动跳过,如果ACTION是递归的,grep将递归地读取每个目录下的所有文件,这相当于-r选项。
  • -E, --extended-regexp: 将模式解释为扩展的正则表达式。
  • -e PATTERN, --regexp=PATTERN: 使用PATTERN作为模式,用于保护以-开头的模式。
  • -F, --fixed-strings: 将PATTERN解释为固定字符串的列表,用换行符分隔,这些字符串可以匹配。
  • -P, --perl-regexp: 将PATTERN解释为Perl正则表达式。
  • -f FILE, --file=FILE: 从FILE获取模式,每行一个,空文件包含零个模式,因此不匹配。
  • -G, --basic-regexp: 将PATTERN解释为基本正则表达式,这是默认值。
  • -H, --with-filename: 打印每个匹配项的文件名。
  • -h, --no-filename: 当搜索多个文件时,禁止在输出中使用文件名前缀。
  • --help: 显示帮助文件。
  • -I: 处理二进制文件,就像它不包含匹配数据一样,这相当于--binary-files=without-match选项。
  • -i, --ignore-case: 忽略PATTERN和输入文件中的大小写区别。
  • -L, --files-without-match: 禁止正常输出,而是打印通常不会从中打印输出的每个输入文件的名称,扫描将在第一个匹配时停止。
  • -l, --files-with-matches: 禁止正常输出,而是打印通常从中打印输出的每个输入文件的名称,扫描将在第一个匹配时停止。
  • -m NUM, --max-count=NUM: 在匹配行数之后停止读取文件。如果输入是来自常规文件的标准输入,并且输出NUM个匹配行,grep确保标准输入在退出之前定位到最后一个匹配行之后,而不管是否存在后续上下文行。这使调用进程能够继续(恢复)搜索,当grep在NUM个匹配行之后停止时,它输出任何后面的上下文行。当-c--count选项也被使用时,grep不会输出大于NUM的计数。当-v--invert match选项也被使用时,grep会在输出NUM个不匹配的行之后停止。
  • --mmap: 如果可能,使用mmap系统调用来读取输入,而不是默认的读取系统调用。在某些情况下,--mmap可以产生更好的性能。但是,如果在grep操作时输入文件收缩,或者发生I/O错误,那么--mmap可能会导致未定义的行为(包括核心转储)。
  • -n, --line-number: 在输出的每一行前面加上输入文件中的行号。
  • -o, --only-matching: 只显示匹配行中与模式匹配的部分。
  • --label=LABEL: 将实际来自标准输入的输入显示为来自文件LABEL的输入。这对于zgrep之类的工具尤其有用,例如gzip -cd foo.gz | grep -H --label = foo
  • --line-buffered: 使用行缓冲,这可能会导致性能损失。
  • -q, --quiet, --silent: 保持安静,不向标准输出写入任何内容。如果找到任何匹配项,即使检测到错误,也立即退出,状态为零。
  • -R, -r, --recursive: 递归地读取每个目录下的所有文件,这相当于-d recurse选项。
  • -s, --no-messages: 禁止显示有关不存在或不可读文件的错误消息。
  • -U, --binary: 将文件视为二进制文件。默认情况下,在MS-DOSMS Windows下,grep通过查看从文件中读取的第一个32KB的内容来猜测文件类型。如果grep确定文件是文本文件,它将从原始文件内容中删除CR字符(以使带有^$的正则表达式正常工作)。指定-U会推翻这种猜测,导致读取所有文件并逐字传递给匹配机制,如果文件是一个文本文件,每行末尾都有CR/LF对,这将导致某些正则表达式失败。此选项对MS-DOSMS Windows以外的平台无效。
  • -u, --unix-byte-offsets: 报告Unix样式的字节偏移量,此开关使grep报告字节偏移,就好像该文件是Unix样式的文本文件一样,即去除了CR字符。这将产生与在Unix机器上运行grep相同的结果,除非也使用-b选项,否则该选项无效。它对除MS-DOSMS-Windows以外的平台没有影响。
  • -V, --version: 输出版本信息。
  • -v, --invert-match: 反转匹配的意义,以选择不匹配的行。
  • -w, --word-regexp: 只选择与表单中包含的单词匹配的行。测试是匹配的子串必须在行的开头,或者前面有非单词组成字符,同样,它必须位于行的末尾,或者后跟非单词组成字符。单词组成字符是字母、数字和下划线。
  • -x, --line-regexp: 仅选择与整行完全匹配的那些匹配项。
  • -Z, --null: 输出零字节(ASCII NULL字符),而不是通常在文件名后的字符。例如grep -lZ在每个文件名之后输出一个零字节,而不是通常的换行符。即使存在包含不寻常字符(例如换行符)的文件名,此选项也可以使输出明确。此选项可与find -print0perl -0sort -zxargs -0等命令一起使用,以处理任意文件名,即使是包含换行符的文件名。

示例

hello.c文件内容如下:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main() {
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
return 0;
}

匹配带有Hello的行。

1
2
3
4
grep Hello hello.c
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

匹配带有Hello行的数量。

1
2
grep -c Hello hello.c
# 3

反转匹配的意义,选择不匹配Hello的行。

1
2
3
4
5
6
7
grep -v Hello hello.c
# #include <stdio.h>
# #include <stdlib.h>
#
# int main() {
# return 0;
# }

匹配带有i的行并忽略大小写。

1
2
3
4
5
6
7
grep -i I hello.c
# #include <stdio.h>
# #include <stdlib.h>
# int main() {
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

仅输出与文件整行匹配的行。

1
2
grep -x "   return 0;" hello.c
# return 0;

匹配带有Hello的行并输出行号。

1
2
3
4
grep -n Hello hello.c
# 5: printf("Hello World\n");
# 6: printf("Hello World\n");
# 7: printf("Hello World\n");

递归匹配当前目录下所有文件中能够匹配h*的文件,输出行号并忽略大小写,注意实际在终端中匹配成功的位置会使用红色字体标注。

1
2
3
4
5
6
7
8
9
10
grep -rni "h*" ./
# ./hello.c:1:#include <stdio.h>
# ./hello.c:2:#include <stdlib.h>
# ./hello.c:3:
# ./hello.c:4:int main() {
# ./hello.c:5: printf("Hello World\n");
# ./hello.c:6: printf("Hello World\n");
# ./hello.c:7: printf("Hello World\n");
# ./hello.c:8: return 0;
# ./hello.c:9:}

fold命令

fold命令用于限制文件列宽,其会从指定的文件里读取内容,将超过限定列宽的列加入增列字符后,输出到标准输出设备。若不指定任何文件名称,或是所给予的文件名为-,则fold命令会从标准输入设备读取数据。

语法

1
fold [OPTION]... [FILE]...

参数

  • -b, --bytes: 计算字节数而不是列数。
  • -s, --spaces: 在空格处跳过。
  • -w, --width=WIDTH: 使用n列,而不是默认值80
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

示例

使用fold命令进行分隔,每行最多包含默认值80个字符。

1
2
3
4
5
fold file.txt
# fold command in Linux wraps each line in an input file to fit a specified width
# and prints it to the standard output. By default, it wraps lines at a maximum wi
# dth of 80 columns but this is configurable. To fold input using the fold command
# pass a file or standard input to the command.

使用fold命令进行分隔,指定每行最多包含默认值50个字符。

1
2
3
4
5
6
7
fold -w 50 file.txt
# fold command in Linux wraps each line in an input
# file to fit a specified width and prints it to the
# standard output. By default, it wraps lines at a
# maximum width of 80 columns but this is configurab
# le. To fold input using the fold command pass a fi
# le or standard input to the command.

使用fold命令进行分隔,并使用-s选项用于分隔空格上的行,以便不打断单词。

1
2
3
4
5
6
7
8
fold -w 50 -s file.txt
# fold command in Linux wraps each line in an input
# file to fit a specified width and prints it to
# the standard output. By default, it wraps lines
# at a maximum width of 80 columns but this is
# configurable. To fold input using the fold
# command pass a file or standard input to the
# command.

fmt命令

fmt命令用于编排文本文件,其会从指定的文件里读取内容,将其依照指定格式重新编排后,输出到标准输出设备,若指定的文件名为-,则fmt指令会从标准输入设备读取数据。

语法

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

参数

  • -c, --crown-margin: 保留前两行的缩进。
  • -p, --prefix=STRING: 仅重新格式化以STRING开头的行,并将前缀重新附加到格式化后的行上。
  • -s, --split-only: 拆分长行,但不再重新填充它们。
  • -t, --tagged-paragraph: 第一行的缩进不同于第二行。
  • -u, --uniform-spacing: 单词之间使用一个空格,句子后面使用两个空格。
  • -w, --width=WIDTH: 最大行宽(默认为75列)。
  • -g, --goal=WIDTH: 目标宽度(默认为宽度的93%)。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

默认情况下,fmt不使用任何选项,将给定文件中存在的所有单词格式化为一行,当然默认单行最大宽度75

1
2
3
4
5
6
7
8
9
10
cat file.txt
# Hello
# everyone.
# Have
# a
# nice
# day.

fmt file.txt
# Hello everyone. Have a nice day.

格式化文件,并使用-w选项指定文件行最大宽度,添加单词超出长度则将单词换行。

1
2
3
4
5
6
7
8
9
10
11
12
13
cat file.txt
# Hello
# everyone.
# Have
# a
# nice
# day.

fmt -w 10 file.txt
# Hello
# everyone.
# Have a
# nice day.

-s选项分割了很长的行,但是不重新填充它们。

1
2
3
4
5
6
7
8
9
10
cat file.txt
# Love is patient, love is kind. It does not envy, it does not boast, it is not proud. It is not rude, it is not self-seeking, it is not easily angered, it keeps no record of wrongs. Love does not delight in evil but rejoices with the truth. It always protects, always trusts, always hopes, always perseveres. Love never fails.

fmt -s file.txt
# Love is patient, love is kind. It does not envy, it does not boast, it
# is not proud. It is not rude, it is not self-seeking, it is not easily
# angered, it keeps no record of wrongs. Love does not delight in evil
# but rejoices with the truth. It always protects, always trusts, always
# hopes, always perseveres. Love never fails.

find命令

find命令用来在指定目录下查找文件,任何位于参数之前的字符串都将被视为要查找的目录名,如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

语法

1
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]

参数

  • -amin<minute>: 查找在指定时间曾被存取过的文件或目录,单位以分钟计算。
  • -anewer<file or folder>: 查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录。
  • -atime<day>: 查找在指定时间曾被存取过的文件或目录,单位以天计算。
  • -cmin<minute>: 查找在指定时间之时被更改过的文件或目录。
  • -cnewer<file or folder>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。
  • -ctime<day>: 查找在指定时间之时被更改的文件或目录,单位以天计算。
  • -daystart: 从本日开始计算时间。
  • -depth: 从指定目录下最深层的子目录开始查找。
  • -empty: 寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录。
  • -exec<command>: 假设find指令的回传值为True,就执行该指令。
  • -false: 将find指令的回传值皆设为False
  • -fls<file list>: 此参数的效果和指定-ls参数类似,但会把结果保存为指定的列表文件。
  • -follow: 排除符号连接。
  • -fprint<file list>: 此参数的效果和指定-print参数类似,但会把结果保存成指定的列表文件。
  • -fprint0<file list>: 此参数的效果和指定-print0参数类似,但会把结果保存成指定的列表文件。
  • -fprintf<file list><output format>: 此参数的效果和指定-printf参数类似,但会把结果保存成指定的列表文件。
  • -fstype<file system type>: 只寻找该文件系统类型下的文件或目录。
  • -gid<group id>: 查找符合指定之群组识别码的文件或目录。
  • -group<group name>: 查找符合指定之群组名称的文件或目录。
  • -help, --help: 在线帮助。
  • -ilname<template style>: 此参数的效果和指定-lname参数类似,但忽略字符大小写的差别。
  • -iname<template style>: 此参数的效果和指定-name参数类似,但忽略字符大小写的差别。
  • -inum<inode num>: 查找符合指定的inode编号的文件或目录。
  • -ipath<template style>: 此参数的效果和指定-path参数类似,但忽略字符大小写的差别。
  • -iregex<template style>: 此参数的效果和指定-regexe参数类似,但忽略字符大小写的差别。
  • -links<number of connections>: 查找符合指定的硬连接数目的文件或目录。
  • -iname<template style>: 指定字符串作为寻找符号连接的范本样式。
  • -ls: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。
  • -maxdepth<directory level>: 设置最大目录层级。
  • -mindepth<directory level>: 设置最小目录层级。
  • -mmin<minute>: 查找在指定时间曾被更改过的文件或目录,单位以分钟计算。
  • -mount: 此参数的效果和指定-xdev相同。
  • -mtime<24 hour>: 查找在指定时间曾被更改过的文件或目录,单位以24小时计算。
  • -name<template style>: 指定字符串作为寻找文件或目录的范本样式。
  • -newer<file or folder>: 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。
  • -nogroup: 找出不属于本地主机群组识别码的文件或目录。
  • -noleaf: 不去考虑目录至少需拥有两个硬连接存在。
  • -nouser: 找出不属于本地主机用户识别码的文件或目录。
  • -ok<command>: 此参数的效果和指定-exec类似,但在执行指令之前会先询问用户,若回答yY,则放弃执行命令。
  • -path<template style>: 指定字符串作为寻找目录的范本样式。
  • -perm<permission value>: 查找符合指定的权限数值的文件或目录。
  • -print: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有./字符串。
  • -print0: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行。
  • -printf<output format>: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定。
  • -prune: 不寻找字符串作为寻找文件或目录的范本样式;
  • -regex<template style>: 指定字符串作为寻找文件或目录的范本样式。
  • -size<file size>: 查找符合指定的文件大小的文件。
  • -true: 将find指令的回传值皆设为True
  • -type<file type>: 只寻找符合指定的文件类型的文件。
  • -uid<user id>: 查找符合指定的用户识别码的文件或目录。
  • -used<day>: 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算。
  • -user<owner name>: 查找符和指定的拥有者名称的文件或目录。
  • -version, --version: 显示版本信息。
  • -xdev: 将范围局限在先行的文件系统中。
  • -xtype<file type>: 此参数的效果和指定-type参数类似,差别在于它针对符号连接检查。

示例

查找/tmp/目录及其子目录下所有拓展名为py的文件。

1
2
find /tmp/ -name *.py
# /tmp/file.py

查找/tmp/目录及其子目录下所有一般文件。

1
2
3
4
5
6
7
8
find /tmp/ -type f
# /tmp/file.c
# /tmp/file.txt
# /tmp/a.out
# /tmp/www/1.txt
# /tmp/file.py
# /tmp/file
# ...

查找/tmp/目录及其子目录下所有最近1天内更改过的文件,+1则表示1天前更改过文件。

1
2
3
4
5
find /tmp/ -ctime -1
# /tmp/
# /tmp/1
# /tmp/file.txt
# /tmp/file

查找/tmp/目录及其子目录下所有更改时间在7日以前的普通文件,并在删除之前询问是否删除。

1
2
3
find /tmp/ -type f -mtime +7 -ok rm {} \;
# < rm ... /tmp/file.py > ? n
# ...

查找/tmp/目录及其子目录下所有文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件。

1
2
3
4
find /tmp/  -type f -perm 644 -exec ls -l {} \;
# -rw-r--r-- 1 root root 60 Jul 22 19:55 /tmp/file.c
# -rw-r--r-- 1 www www 73 Jul 23 20:54 /tmp/file.txt
# ...

查找/tmp/目录及其子目录下所有文件长度为0的普通文件,并列出它们的完整路径。

1
2
find /tmp/ -type f -size 0 -exec ls -l {} \;
# -rwx------ 1 root root 0 Jul 11 17:25 /tmp/file.py

file命令

file命令用来探测给定文件的类型,file命令对文件的检查分为文件系统、魔法文件和语言检查3个过程。

语法

1
2
file [ -bchikLnNprsvz ] [ -f namefile ] [ -F separator ] [ -m magicfiles ] [file or folder] ...
file -C [ -m magicfile ]

参数

  • -b, --brief: 简洁模式,列出辨识结果时,不显示文件名称。
  • -c, --checking-printout: 详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -C, --compile: 编译一个magic.mgc输出文件,其中包含文件的预解析版本。
  • -f, --files-from <file>: 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
  • -F, --separator separator: 使用指定的字符串作为文件名和返回的文件结果之间的分隔符,默认为:
  • -i, --mime: 使文件命令输出mime类型。
  • -L: 直接显示符号连接所指向的文件的类别。
  • -L, --dereference: 跟随符号链接,如果设置了POSIXLY_CORRECT,则为默认值。
  • -m <file>: 指定魔法文件,magic file规则就是根据文件的特殊内容去判断一个文件的类型,例如tar格式的标识信息,通常默认magic file文件存在于/usr/share/file/等目录下。
  • -n, --no-buffer: 检查每个文件后强制刷新标准输出,仅在检查文件列表时才有用,该选项供希望从管道输出文件类型的程序使用。
  • -N, --no-pad: 不要填充文件名,以使它们在输出中对齐。
  • -r, --raw: 不将无法打印的字符翻译为\ooo,通常文件将不可打印的字符转换为八进制表示形式。
  • -v: 显示版本信息。
  • -z: 尝试去解读压缩文件的内容。
  • file or folder: 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

示例

显示文件类型。

1
2
file file.txt
# file.txt: ASCII text

显示文件MIME类型。

1
2
file -i file.txt
# file.txt: text/plain; charset=us-ascii

简洁模式,不显示文件名。

1
2
file -b -i file.txt
# text/plain; charset=us-ascii

fgrep命令

当需要搜索包含很多正则表达式元字符的字符串时,例如$^等,fgrep很有用,其通过指定搜索字符串包含固定字符,从而无需对每个字符进行转义用反斜杠,如果搜索的字符串包含换行符,则每行将被视为要在搜索中匹配的单个固定字符字符串。也就是说fgrep是用来搜索固定字符的,固定字符表示字符串是按字面意义解释的-元字符不存在,因此不能使用正则表达式,运行fgrep与使用-F选项运行grep效果相同。

语法

1
fgrep [-b] [-c] [-h] [-i] [-l] [-n] [-s] [-v] [-x] [ -e pattern_list] [-f pattern-file] [pattern] [file]

参数

  • -b: 在每一行前面加上找到该行所在的块号,这在根据上下文(第一个块为0)定位块号时非常有用。
  • -c: 只打印包含模式的行数。
  • -h: 搜索多个文件时禁止打印文件。
  • -i: 在比较时忽略大小写的区别。
  • -l: 打印一次具有匹配行的文件名称,用换行分隔,当模式出现多次时,不会重复文件名。
  • -n: 在文件中,在每一行前面加上它的行号(第一行是1)。
  • -s: 静默工作,也就是说只显示错误消息,这对于检查错误状态非常有用。
  • -v: 打印除包含模式的行以外的所有行。
  • -x: 仅打印完全匹配的行。
  • -e pattern_list: 在pattern list中搜索字符串,当字符串以-开头时很有用。
  • -f pattern-file: 从模式文件中获取模式列表。
  • pattern: 指定在搜索输入期间使用的模式。
  • file: 要搜索模式的文件的路径名,如果没有指定文件参数,将使用标准输入。

示例

hello.c文件内容如下:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main() {
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
return 0;
}

匹配带有Hello的行。

1
2
3
4
fgrep Hello hello.c
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

匹配带有Hello行的数量。

1
2
fgrep -c Hello hello.c
# 3

反转匹配的意义,选择不匹配Hello的行。

1
2
3
4
5
6
7
fgrep -v Hello hello.c
# #include <stdio.h>
# #include <stdlib.h>
#
# int main() {
# return 0;
# }

匹配带有i的行并忽略大小写。

1
2
3
4
5
6
7
fgrep -i I hello.c
# #include <stdio.h>
# #include <stdlib.h>
# int main() {
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

仅输出与文件整行匹配的行。

1
2
fgrep -x "   return 0;" hello.c
# return 0;

匹配带有Hello的行并输出行号。

1
2
3
4
fgrep -n Hello hello.c
# 5: printf("Hello World\n");
# 6: printf("Hello World\n");
# 7: printf("Hello World\n");

递归匹配当前目录下所有文件中能够匹配h*的文件,请注意由于使用fgrep,命令是不会匹配*的模式,而是将其作为固定字符*去匹配,所以此时是没有匹配的,如果使用grep以及相同的参数,则能够输出行号并忽略大小写,注意实际在终端中匹配成功的位置会使用红色字体标注。

1
2
fgrep -rni "h*" ./
# [输出为空]

ex命令

ex命令用于在Ex模式下启动vim文本编辑器,ex执行效果如同vi -e,如要从Ex模式回到普通模式,则在vim中输入:vi:visual指令即可,可以通过运行vi -e来启动ex,也可以通过运行ex -v来启动viexvim的基础,vim是世界上最受欢迎的文本编辑器之一。ex并不是另一个编辑器,应该说vi是更一般更基本的ex行编辑器的可视模式,所以ex算是vi的底层行编辑器。由于一些ex命令可以节省大量的编辑时间,因此在使用vi时它们是非常有用的,这些命令的大部分都可以在不离开vi的情况下使用。

语法

1
2
ex [ -| -s ] [ -l ] [ -L ] [ -R ] [ -r [ file ] ] [ -t tag ] [ -v ] [ -V ] 
[ -x ] [ -wn ] [ -C ] [ +command | -c command ] file

参数

  • --: 此后仅文件名。
  • -v: 在vi模式下启动vim
  • -e: 在ex模式下启动vim
  • -E: 以改进的ex模式启动vim
  • -s: 沉默模式,仅当以Ex开头或在-s选项之前给出-e选项时生效。
  • -d: 以diff模式启动,应该有两个或三个文件名参数,vim将打开所有文件并显示它们之间的差异,像vimdiff一样工作。
  • -y: 以简单模式启动vim,类似于evimeview,使vim的行为像单击并键入编辑器。
  • -R: 只读模式,将设置readonly选项,此时仍然可以编辑缓冲区,但将防止意外覆盖文件。如果仍要覆盖文件,请在Ex命令中使用w!
  • -Z: 限制模式,类似于rvim
  • -m: 禁止修改文件,重置写入选项,此时仍然可以修改缓冲区,但不可写入文件。
  • -M: 不允许修改,可修改和写入选项将被取消设置,因此不允许进行更改并且无法写入文件。请注意,可以设置这些选项以进行修改。
  • -b: 二进制模式,将设置一些选项,以便可以编辑二进制文件或可执行文件。
  • -l: Lisp模式,将lispshowmatch选项设置为开。
  • -C: 兼容的,设置兼容选项,这将使vim的行为与vi类似,即使存在.vimrc文件。
  • -N: 不兼容模式,重置兼容选项,即使.vimrc文件不存在,这也会使vim表现得更好,但与vi的兼容性较差。
  • -V[N][fname]: 详细信息,提供有关哪些文件来源以及用于读取和写入viminfo文件的消息,可选数字N是详细的值,默认值是10
  • -D: 调试模式,从脚本执行第一个命令时转到调试模式。
  • -n: 不会使用交换文件,这样崩溃后的恢复将是不可能的。如果要在非常慢的介质例如软盘上编辑文件,此功能非常方便。
  • -r: 列出交换文件,以及有关使用它们进行恢复的信息。
  • -r <file name>: 恢复模式,交换文件用于恢复崩溃的编辑会话,交换文件与附加.swp的文本文件具有相同的文件名。
  • -L: 与-r相同。
  • -A: 如果vim是在阿拉伯语支持下编译的,用于编辑从右向左的文件和阿拉伯语键盘映射,则此选项将以阿拉伯语模式启动vim,即设置ARABIC,否则将发出错误消息,vim将中止。
  • -H: 以希伯来语模式启动。
  • -F: 以波斯语模式开始。
  • -T <terminal>: 告诉vim正在使用的终端的名称,仅在自动方式无效时才需要,应该是vim内置已知的终端,或在termcapterminfo文件中定义的终端。
  • --not-a-term: 输入或输出不是终端时跳过警告。
  • -u <vimrc>: 使用文件.vimrc中的命令进行初始化,将跳过所有其他初始化。使用此选项可编辑特殊类型的文件,也可以用来跳过所有的初始化,方法是给名称NONE。 initialization”。
  • --noplugin: 跳过加载插件,由-u表示无。
  • -p[N]: 打开N个标签页,如果省略N,则为每个文件打开一个标签页。
  • -o[N]: 打开堆叠的N个窗口,当省略N时,为每个文件打开一个窗口。
  • -O[N]: 并排打开N个窗口,如果省略N,则为每个文件打开一个窗口。
  • +: 从文件末尾开始。
  • +<lnum>: 对于第一个文件,光标将定位在num行上。如果缺少num,则光标将位于最后一行。
  • --cmd <command>: 在加载任何.vimrc文件之前执行<command>
  • -c <command>: 加载第一个文件后执行<command>
  • -S <session>: 加载第一个文件后源文件的<session>
  • -s <scriptin>: 从文件<scriptin>中读取普通模式命令。
  • -w <scriptout>: 将所有键入的命令附加到文件<scriptout>
  • -W <scriptout>: 将所有键入的命令写入文件<scriptout>
  • -x: 编辑加密文件。
  • --startuptime <file>: 将启动定时消息写入<file>
  • -i <viminfo>: 使用<viminfo>而不是.viminfo
  • -h or --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

file.txt启动ex编辑模式。

1
ex file.txt

显示总行数、当前行号。

1
= | .=

打印文件前3行内容。

1
1,3 p

删除第1到第2行,切换回vi模式查看效果。

1
2
1,2 d
vi

移动第12行到第3行下边。

1
2
1,2 m 3
vi

复制第12行到第3行下边。

1
2
1,2 co 3
vi

expr命令

expr命令计算给定表达式并显示其相应的输出,其被使用用于:基本操作像加法、减法、乘法、除法和模等等整数,求值正则表达式,字符串操作,如子字符串,字符串长度等。

语法

1
expr [EXPRESSION | OPTION]

参数

  • --help: 输出帮助信息。
  • --version: 输出版本信息。

表达式

  • ARG1 | ARG2: ARG1,如果它既不为null也不为0,否则为ARG2
  • ARG1 & ARG2: 如果两个参数都不为null0,则为ARG1,否则为0
  • ARG1 < ARG2: ARG1小于ARG2
  • ARG1 <= ARG2: ARG1小于等于ARG2
  • ARG1 = ARG2: ARG1等于ARG2
  • ARG1 != ARG2: ARG1ARG2不相等。
  • ARG1 >= ARG2: ARG1大于或等于ARG2
  • ARG1 > ARG2: ARG1大于ARG2
  • ARG1 + ARG2: ARG1ARG2的算术和。
  • ARG1 - ARG2: ARG1ARG2的算术差。
  • ARG1 * ARG2: ARG1ARG2的算术乘积。
  • ARG1 / ARG2: ARG1除以ARG2的算术商。
  • ARG1 % ARG2: ARG1除以ARG2的算术余数。
  • STRING : REGEXP: 正则表达式REGEXPSTRING中的定位模式匹配。
  • match STRING REGEXP: 与STRING相同REGEXP
  • substr STRING POS LENGTH: STR的子字符串,POS1开始计数。
  • index STRING CHARS: 找到任何CHARSSTRING中的索引,或者为0
  • length STRING: 字符串长度。
  • + TOKEN: 将TOKEN解释为字符串,即使它是像match这样的关键字或像/这样的操作符。
  • ( EXPRESSION ): EXPRESSION的值。

示例

计算12 + 9

1
2
expr 12 + 9
# 21

计算12 * 2

1
2
expr 12 \* 2
# 24

shell脚本中的变量执行操作,注意保存成.sh文件并赋权限755再执行。

1
2
3
4
5
echo "Enter two numbers"
read x
read y
sum=`expr $x + $y`
echo "Sum = $sum"

egrep命令

egrep命令用于模式搜索,属于grep函数族,工作原理和grep -E一样,其将模式视为扩展正则表达式,并打印出与模式匹配的行,如果有多个文件具有匹配的模式,其还能显示每行的文件名。

语法

1
egrep [options] PATTERN [FILE...]

参数

  • -A NUM, --after-context=NUM: 在匹配行之后打印尾部上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -a, --text: 像处理文本一样处理二进制文件,这相当于--binary files=text选项。
  • -B NUM, --before-context=NUM: 在匹配行之前打印前导上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -C NUM, --context=NUM: 打印输出上下文的NUM行,在相邻的匹配组之间放置包含--的行。
  • -b, --byte-offset: 打印输入文件中每行输出之前的字节偏移量。
  • --binary-files=TYPE: 如果文件的前几个字节指示该文件包含二进制数据,则假定该文件为类型类型。默认情况下,TYPEbinarygrep通常输出一行消息,说明二进制文件匹配,或者不输出消息(如果不匹配)。如果TYPE不匹配,grep假设二进制文件不匹配,这相当于-I选项。如果TYPEtextgrep会像处理文本一样处理二进制文件,这相当于-a选项。此外grep--binary files=text可能会输出二进制垃圾,如果输出是终端,并且终端驱动程序将其中的一些解释为命令,则会产生严重的副作用。
  • --colour[=WHEN], --color[=WHEN]: 在匹配字符串周围加上标记find in GREP_COLOR环境变量,WHEN可以是neveralwaysauto
  • -c, --count: 禁止正常输出,而是为每个输入文件打印匹配行的计数,使用-v,--invert match选项,计算不匹配的行数。
  • -D ACTION, --devices=ACTION: 如果输入文件是设备、FIFO或套接字,使用ACTION来处理它。默认情况下,ACTIONread,这意味着设备的读取就像它们是普通文件一样,如果ACTIONskip,则设备将自动跳过。
  • -d ACTION, --directories=ACTION: 如果输入文件是目录,使用ACTION来处理它。默认情况下,ACTIONread,这意味着目录的读取就像它们是普通文件一样,如果ACTIONskip,则目录将被自动跳过,如果ACTION是递归的,grep将递归地读取每个目录下的所有文件,这相当于-r选项。
  • -e PATTERN, --regexp=PATTERN: 使用PATTERN作为模式,用于保护以-开头的模式。
  • -F, --fixed-strings: 将PATTERN解释为固定字符串的列表,用换行符分隔,这些字符串可以匹配。
  • -P, --perl-regexp: 将PATTERN解释为Perl正则表达式。
  • -f FILE, --file=FILE: 从FILE获取模式,每行一个,空文件包含零个模式,因此不匹配。
  • -G, --basic-regexp: 将PATTERN解释为基本正则表达式,这是默认值。
  • -H, --with-filename: 打印每个匹配项的文件名。
  • -h, --no-filename: 当搜索多个文件时,禁止在输出中使用文件名前缀。
  • --help: 显示帮助文件。
  • -I: 处理二进制文件,就像它不包含匹配数据一样,这相当于--binary-files=without-match选项。
  • -i, --ignore-case: 忽略PATTERN和输入文件中的大小写区别。
  • -L, --files-without-match: 禁止正常输出,而是打印通常不会从中打印输出的每个输入文件的名称,扫描将在第一个匹配时停止。
  • -l, --files-with-matches: 禁止正常输出,而是打印通常从中打印输出的每个输入文件的名称,扫描将在第一个匹配时停止。
  • -m NUM, --max-count=NUM: 在匹配行数之后停止读取文件。如果输入是来自常规文件的标准输入,并且输出NUM个匹配行,grep确保标准输入在退出之前定位到最后一个匹配行之后,而不管是否存在后续上下文行。这使调用进程能够继续(恢复)搜索,当grep在NUM个匹配行之后停止时,它输出任何后面的上下文行。当-c--count选项也被使用时,grep不会输出大于NUM的计数。当-v--invert match选项也被使用时,grep会在输出NUM个不匹配的行之后停止。
  • --mmap: 如果可能,使用mmap系统调用来读取输入,而不是默认的读取系统调用。在某些情况下,--mmap可以产生更好的性能。但是,如果在grep操作时输入文件收缩,或者发生I/O错误,那么--mmap可能会导致未定义的行为(包括核心转储)。
  • -n, --line-number: 在输出的每一行前面加上输入文件中的行号。
  • -o, --only-matching: 只显示匹配行中与模式匹配的部分。
  • --label=LABEL: 将实际来自标准输入的输入显示为来自文件LABEL的输入。这对于zgrep之类的工具尤其有用,例如gzip -cd foo.gz | grep -H --label = foo
  • --line-buffered: 使用行缓冲,这可能会导致性能损失。
  • -q, --quiet, --silent: 保持安静,不向标准输出写入任何内容。如果找到任何匹配项,即使检测到错误,也立即退出,状态为零。
  • -R, -r, --recursive: 递归地读取每个目录下的所有文件,这相当于-d recurse选项。
  • -s, --no-messages: 禁止显示有关不存在或不可读文件的错误消息。
  • -U, --binary: 将文件视为二进制文件。默认情况下,在MS-DOSMS Windows下,grep通过查看从文件中读取的第一个32KB的内容来猜测文件类型。如果grep确定文件是文本文件,它将从原始文件内容中删除CR字符(以使带有^$的正则表达式正常工作)。指定-U会推翻这种猜测,导致读取所有文件并逐字传递给匹配机制,如果文件是一个文本文件,每行末尾都有CR/LF对,这将导致某些正则表达式失败。此选项对MS-DOSMS Windows以外的平台无效。
  • -u, --unix-byte-offsets: 报告Unix样式的字节偏移量,此开关使grep报告字节偏移,就好像该文件是Unix样式的文本文件一样,即去除了CR字符。这将产生与在Unix机器上运行grep相同的结果,除非也使用-b选项,否则该选项无效。它对除MS-DOSMS-Windows以外的平台没有影响。
  • -V, --version: 输出版本信息。
  • -v, --invert-match: 反转匹配的意义,以选择不匹配的行。
  • -w, --word-regexp: 只选择与表单中包含的单词匹配的行。测试是匹配的子串必须在行的开头,或者前面有非单词组成字符,同样,它必须位于行的末尾,或者后跟非单词组成字符。单词组成字符是字母、数字和下划线。
  • -x, --line-regexp: 仅选择与整行完全匹配的那些匹配项。
  • -Z, --null: 输出零字节(ASCII NULL字符),而不是通常在文件名后的字符。例如grep -lZ在每个文件名之后输出一个零字节,而不是通常的换行符。即使存在包含不寻常字符(例如换行符)的文件名,此选项也可以使输出明确。此选项可与find -print0perl -0sort -zxargs -0等命令一起使用,以处理任意文件名,即使是包含换行符的文件名。

示例

hello.c文件内容如下:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main() {
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
return 0;
}

匹配带有Hello的行。

1
2
3
4
egrep Hello hello.c
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

匹配带有Hello行的数量。

1
2
egrep -c Hello hello.c
# 3

反转匹配的意义,选择不匹配Hello的行。

1
2
3
4
5
6
7
egrep -v Hello hello.c
# #include <stdio.h>
# #include <stdlib.h>
#
# int main() {
# return 0;
# }

匹配带有i的行并忽略大小写。

1
2
3
4
5
6
7
egrep -i I hello.c
# #include <stdio.h>
# #include <stdlib.h>
# int main() {
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");

仅输出与文件整行匹配的行。

1
2
egrep -x "   return 0;" hello.c
# return 0;

匹配带有Hello的行并输出行号。

1
2
3
4
egrep -n Hello hello.c
# 5: printf("Hello World\n");
# 6: printf("Hello World\n");
# 7: printf("Hello World\n");

递归匹配当前目录下所有文件中能够匹配h*的文件,输出行号并忽略大小写,注意实际在终端中匹配成功的位置会使用红色字体标注。

1
2
3
4
5
6
7
8
9
10
egrep -rni "h*" ./
# ./hello.c:1:#include <stdio.h>
# ./hello.c:2:#include <stdlib.h>
# ./hello.c:3:
# ./hello.c:4:int main() {
# ./hello.c:5: printf("Hello World\n");
# ./hello.c:6: printf("Hello World\n");
# ./hello.c:7: printf("Hello World\n");
# ./hello.c:8: return 0;
# ./hello.c:9:}

ed命令

ed命令是文本编辑器,用于文本编辑,edLinux中功能最简单的文本编辑程序,一次仅能编辑一行而非全屏幕方式的操作。ed命令并不是一个常用的命令,一般使用比较多的是vi指令,但ed文本编辑器对于编辑大文件或对于在shell脚本程序中进行文本编辑很有用。如果使用文件名参数调用ed,则文件的副本将被读入编辑器的缓冲区,对该副本进行更改,而不是直接对文件本身进行更改。退出ed后,任何未使用w命令显式保存的更改都将丢失。编辑有两种不同的模式:命令和输入。第一次调用时,ed处于命令模式,在这种模式下,命令从标准输入中读取并执行以操作编辑器缓冲区的内容。

语法

1
ed [options] [file]

参数

  • -G, --traditional: 在兼容模式下运行。
  • -l, --loose-exit-status: 即使命令失败,也以零状态退出(正常终止)。例如如果将ed设置为crontab的编辑器,则此选项很有用。
  • -p, --prompt=STRING: ed通常在空白行等待用户输入,此选项将使用字符串作为提示。
  • -r, --restricted: 在受限模式下运行。
  • -s, --quiet, --silent: 禁止诊断。
  • -v, --verbose: 详细操作。
  • -h, --help: 显示帮助信息。
  • -V, --version: 显示版本信息。

状态码

  • 0表示正常退出。
  • 1表示环境问题,例如文件未找到、无效标志、I/O错误等等。
  • 2表示损坏或无效的输入文件。
  • 3表示内部一致性错误(如软件bug),导致ed死机。

示例

比较完整的编辑示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
ed
a
My name is Titan.
And I love Perl very much.
.
i
I am 24.
.
c
I am 24 years old.
.
w readme.txt
q
1
2
3
4
5
6
7
8
9
10
11
12
13
ed                          # 激活 ed 命令 
a # 告诉 ed 我要编辑新文件
My name is Titan. # 输入第一行内容
And I love Perl very much. # 输入第二行内容
. # 返回 ed 的命令行状态
i # 告诉 ed 我要在最后一行之前插入内容
I am 24. # 将 I am 24. 插入 My name is Titan. 和 And I love Perl very much. 之间
. # 返回 ed 的命令行状态
c # 告诉 ed 我要替换最后一行输入内容
I am 24 years old. # 将 I am 24. 替换成 I am 24 years old. ,这里替换的是最后输的内容
. # 返回 ed 的命令行状态
w readme.txt # 将文件命名为 readme.txt 并保存,如果是编辑已经存在的文件,只需要敲入 w 即可
q # 完全退出 ed 编辑器
1
2
3
4
cat readme.txt
# My name is Titan.
# I am 24 years old.
# And I love Perl very much.

diff命令

diff命令能够比较给定的两个文件的不同,如果使用-代替文件参数,则要比较的内容将来自标准输入,diff命令是以逐行的方式比较文本文件的异同处,如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

语法

1
diff [-abBcdefHilnNpPqrstTuvwy][-<line>][-C <line>][-D <macro>][-I <string>][-S <file>][-W <width>][-x <file or folder>][-X <file>][--help][--left-column][--suppress-common-line][file or folder][file or folder]

参数

  • -a--text: diff预设只会逐行比较文本文件。
  • -b--ignore-space-change: 不检查空格字符的不同。
  • -B--ignore-blank-lines: 不检查空白行。
  • -c: 显示全部内容,并标出不同之处。
  • -C <line>--context <line>: 与执行-c-<line>指令相同。
  • -d--minimal: 使用不同的演算法,以小的单位来做比较。
  • -D <macro>ifdef <macro>: 此参数的输出格式可用于前置处理器巨集。
  • -e--ed: 此参数的输出格式可用于edscript文件。
  • -f-forward-ed: 输出的格式类似edscript文件,但按照原来文件的顺序来显示不同处。
  • -H--speed-large-files: 比较大文件时,可加快速度。
  • -l<string>--ignore-matching-lines<string>: 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
  • -i--ignore-case: 不检查大小写的不同。
  • -l--paginate: 将结果交由pr程序来分页。
  • -n--rcs: 将比较结果以RCS的格式来显示。
  • -N--new-file: 在比较目录时,若文件A仅出现在某个目录中,预设会显示Only in <folder>,文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
  • -p: 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
  • -P--unidirectional-new-file: 与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
  • -q--brief: 仅显示有无差异,不显示详细的信息。
  • -r--recursive: 比较子目录中的文件。
  • -s--report-identical-files: 若没有发现任何差异,仍然显示信息。
  • -S <file>--starting-file <file>: 在比较目录时,从指定的文件开始比较。
  • -t--expand-tabs: 在输出时,将tab字符展开。
  • -T--initial-tab: 在每行前面加上tab字符以便对齐。
  • -u-U <columns>--unified=<columns>: 以合并的方式来显示文件内容的不同。
  • -v--version: 显示版本信息。
  • -w--ignore-all-space: 忽略全部的空格字符。
  • -W <width>--width <width>: 在使用-y参数时,指定栏宽。
  • -x <file or folder>--exclude <file or folder>: 不比较选项中所指定的文件或目录。
  • -X<file>--exclude-from<file>: 您可以将文件或目录类型存成文本文件,然后在<file>中指定此文本文件。
  • -y--side-by-side: 以并列的方式显示文件的异同之处。
  • --help: 显示帮助。
  • --left-column: 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
  • --suppress-common-lines: 在使用-y参数时,仅显示不同之处。

示例

比较file.txtfile2.txt文件的差异,仅输出不同之处。

1
diff file.txt file2.txt

比较file.txtfile2.txt文件的差异,并排输出全部内容,|表示前后2个文件内容有不同,<表示后面文件比前面文件少了1行内容,>表示后面文件比前面文件多了1行内容。

1
diff -y file.txt file2.txt 

比较file.txt与自定义输入内容的差异,输入内容后按Ctrl+D输出EOF标识后结束输入。

1
diff -y file.txt -

diffstat命令

diffstat命令根据diff的比较结果,统计各文件的插入、删除、修改等差异计量。

语法

1
diffstat [options] [files]

参数

  • -c: 输出的每一行都以作为前缀,使其成为Shell脚本的注释行。
  • -C: 添加SGR颜色转义序列以突出显示直方图。
  • -e: 将标准错误重定向到file
  • -f <num>: 指定直方图的格式,0仅显示插入+,删除-或修改!的值和单个直方图代码,1正常输出,2用点填充直方图,4用直方图打印每个值,任何非零值都会给出直方图,点和单个值可以组合。
  • -H: 打印使用情况消息并退出。
  • -k: 禁止合并报告中的文件名。
  • -l: 仅列出文件名,不生成直方图。
  • -n <file length>: 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
  • -o <file>: 将标准输出重定向到file
  • -p <file length>: 与-n参数相同,但此处的<file length>包括了文件的路径。
  • -r: 提供对直方图所示数据的可选舍入,而不是通过误差调整来截断,0是默认值,不进行舍入,但累积的错误将添加到以下列,1舍入数据,2对数据进行舍入并调整直方图,以确保即使有差异通常会四舍五入也存在差异。
  • -t: 覆盖直方图,生成逗号分隔值的输出。
  • -u: 禁止在报告中对文件名进行排序。
  • -v: 显示进度,例如如果将输出重定向到文件,则将进度消息写入标准错误。
  • -w: 指定输出时栏位的宽度。
  • -V: 显示版本信息。

示例

统计diff的比较结果的差异信息。

1
diff file.txt file2.txt | diffstat -v

统计diff的比较结果的差异信息,仅列出文件名,不生成直方图。

1
diff file.txt file2.txt | diffstat -l

统计diff的比较结果的差异信息,指定直方图的最大宽度。

1
diff file.txt file2.txt | diffstat -w 11

cut命令

cut命令用来显示行中的指定部分,其从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出,如果不指定File参数,cut命令将读取标准输入,该命令常用的两项功能,一是用来显示文件的内容,它依次读取由参数file所指明的文件,将它们的内容输出到标准输出上,其二是连接两个或多个文件,如cut f1 f2 > f3将把文件f1和几的内容合并起来,然后通过输出重定向符>的作用,将它们放入文件f3中,当文件较大时,文本在屏幕上迅速闪过,也就是滚屏现象,为了控制滚屏,可以执行Ctrl+S按键停止滚屏,按Ctrl+Q键可以恢复滚屏,按Ctrl+C键终止该命令的执行等操作。

语法

1
cut [OPTION]... [FILE]...

参数

  • -b: 仅显示行中指定直接范围的内容。
  • -c: 仅显示行中指定范围的字符。
  • -d: 指定字段的分隔符,默认的字段分隔符为TAB
  • -f: 显示指定字段的内容。
  • -n: 与-b选项连用,不分割多字节字符。
  • --complement: 补足被选择的字节、字符或字段。
  • --out-delimiter=<delimiter>: 指定输出内容是的字段分割符。
  • --help: 显示指令的帮助信息。
  • --version: 显示指令的版本信息。

示例

截取/tmp/file.txt文件每一行的第3个字符。

1
2
3
4
5
6
7
8
9
10
11
cat /tmp/file.txt | cut -c 3
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 0
# 1
# 2

截取/tmp/file.txt文件每一行的第3-6个字符。

1
2
3
4
5
6
7
8
9
10
11
cat /tmp/file.txt | cut -c 3-6
# 3456
# 4567
# 5678
# 6789
# 7890
# 8901
# 9012
# 0123
# 1234
# 2345

截取/tmp/file.txt文件每一行的第3个字符到结尾字符。

1
2
3
4
5
6
7
8
9
10
11
cat /tmp/file.txt | cut -c 3-
# 34567890
# 45678901
# 56789012
# 67890123
# 78901234
# 89012345
# 90123456
# 01234567
# 12345678
# 23456789

curl命令

curl是一个命令行工具,用于使用任何受支持的协议HTTPFTPIMAPPOP3SCPSFTPSMTPTFTPTELNETLDAPFILE向网络服务器传输数据或从网络服务器传输数据,其被设计成无需用户交互即可工作,因此非常适合在shell脚本中使用,该软件提供代理支持、用户身份验证、FTP上传、HTTP postingSSL连接、cookie、文件断点传输、metalink等功能。

语法

1
curl [options] [URL...]

参数

  • -#, --progress-bar: 让curl将进度显示为一个简单的进度条,而不是标准的、更具信息性的计量器。
  • -:, --next: 告诉curl对以下URL和相关选项使用单独的操作,这允许您发送多个URL请求,每个请求都有自己的特定选项,例如不同的用户名或自定义请求,在7.36.0中添加`。
  • -0, --http1.0: HTTP,告诉curl使用HTTP 1.0版本,而不是内部首选的HTTP 1.1
  • --http1.1: HTTP,告诉curl使用HTTP版本1.1,这是内部默认版本,在7.33.0添加。
  • --http2: HTTP,告诉curl使用HTTP 2发出请求,这需要构建底层libcurl来支持它,在7.33.0添加。
  • --no-npn: 禁用NPN TLS扩展,如果libcurl是使用支持NPNSSL库构建的,则NPN默认启用,支持HTTP 2libcurl使用NPNhttps会话期间与服务器协商对HTTP 2的支持,在7.36.0添加。
  • --no-alpn: 禁用ALPN TLS扩展,如果libcurl是用一个支持ALPNSSL库构建的,那么ALPN默认启用,支持HTTP 2libcurl使用ALPNhttps会话期间与服务器协商对HTTP 2的支持,在7.36.0添加。
  • -1, --tlsv1: SSL,强制curl在与远程TLS服务器协商时使用tls1.x版本,您可以使用选项--tlsv1.0--tlsv1.1--tlsv1.2来更精确地控制TLS版本。
  • -2, --sslv2: SSL,当与远程SSL服务器协商时,强制curl使用SSL version 2
  • -3, --sslv3: SSL,当与远程SSL服务器协商时,强制curl使用SSL version 3
  • -4, --ipv4: 如果curl能够将一个地址解析为多个IP版本(如果它支持IPv6),则此选项告诉curl仅将名称解析为IPv4地址。
  • -6, --ipv6: 如果curl能够将一个地址解析为多个IP版本(如果它支持IPv6),则此选项告诉curl仅将名称解析为IPv6地址。
  • -a, --append: FTP/SFTP,当在FTP上传中使用时,这将告诉curl追加到目标文件,而不是覆盖它,如果文件不存在,就创建它,注意,这个选项会被一些SSH服务器忽略,包括OpenSSH
  • -A, --user-agent <agent string>: HTTP,指定要发送到HTTP服务器的用户代理字符串,如果这个字段没有设置为Mozilla/4.0,一些做得不好的cgi就会失败,要对字符串中的空格进行编码,请用单引号将字符串括起来,当然,这也可以通过-H,-header选项进行设置,如果多次使用此选项,将使用最后一个选项。
  • --anyauth: HTTP,告诉curl自己找出身份验证方法,并使用远程站点声称支持的最安全的方法,这是通过首先执行请求并检查响应头来完成的,因此可能会导致额外的网络往返,这是用来代替设置特定的身份验证方法的,您可以使用--basic--digest--ntlm--negotiate来实现,请注意,如果从stdin上传数据,则不建议使用--anyauth,因为它可能需要发送两次数据,然后客户端必须能够倒带,如果从stdin上传时需要,上传操作将失败。
  • -b, --cookie <name=data>: HTTP,将数据作为cookie传递到HTTP服务器,它应该是以前在Set Cookie:行中从服务器接收到的数据,数据格式应为NAME1=VALUE1; NAME2=VALUE2,如果行中没有使用=符号,则会将其视为用于读取以前存储的cookie行的文件名,如果这些行匹配,则应在此会话中使用,使用这个方法还可以激活cookieparser,它也会让curl记录传入的cookie,如果您将这个方法与-L,-location选项结合使用,这可能会很方便,要从中读取cookie的文件的文件格式应该是纯HTTP头或Netscape/Mozilla cookie文件格式,请注意,用-b, --cookie指定的文件仅用作输入,文件中不会存储Cookie,要存储cookie,请使用-c, --cookiejar选项,或者甚至可以使用-D, --dump-headerHTTP头保存到文件中,如果多次使用此选项,将使用最后一个选项。
  • -B, --use-ascii: FTP/LDAP,启用ASCII传输,对于FTP,这也可以通过使用以type=A结尾的URL来实现,对于win32系统,此选项使发送到标准输出的数据处于文本模式。
  • --basic: HTTP,告诉curl使用HTTP基本身份验证,这是默认值,并且此选项通常是无意义的,除非您使用它来重写先前设置的选项,该选项设置了不同的身份验证方法,例如--ntlm--digest--negotiate
  • -c, --cookie-jar <file name>: HTTP,指定在完成操作后要将所有cookie写入哪个文件,curl写入以前从指定文件读取的所有cookie以及从远程服务器接收的所有cookie,如果没有已知的cookies,则不会写入任何文件,文件将使用Netscape cookie文件格式写入,如果将文件名设置为单破折号-,则cookie将写入标准输出,此命令行选项将激活生成curl记录并使用cookiecookie引擎,另一种激活它的方法是使用-b, --cookie选项,如果不能创建或写入cookiejar,整个curl操作不会失败,甚至不会清楚地报告错误,使用-v会显示一个警告,但这是关于这种可能致命的情况的唯一可见反馈,如果多次使用此选项,将使用最后指定的文件名。
  • -C, --continue-at <offset>: 以给定的偏移量继续/恢复以前的文件传输,给定的偏移量是将被跳过的确切字节数,从源文件的开头开始计算,然后再将其传输到目标,如果与上载一起使用,curl将不使用FTP服务器命令大小,使用-C -告诉curl自动找出在哪里/如何继续传输,然后它使用给定的输出/输入文件来解决这个问题,如果多次使用此选项,将使用最后一个选项。
  • --ciphers <list of ciphers>: SSL,指定要在连接中使用的密码,密码列表必须指定有效的密码,此为的SSL密码列表详细信息http://www.openssl.org/docs/apps/ciphers.htmlNSS密码的实现方式与OpenSSLGnuTLS不同,NSS密码的完整列表位于以下URLNSSCipherSuite条目中http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives,如果多次使用此选项,将使用最后一个选项。
  • --compressed: HTTP,使用curl支持的算法之一请求压缩响应,并保存未压缩的文档,如果使用此选项并且服务器发送不受支持的编码,curl将报告错误。
  • --connect-timeout <seconds>: 允许连接到服务器的最长时间(秒),这只会限制连接阶段,一旦curl连接了,这个选项就不再有用了,自7.32.0以来,此选项接受十进制值,但实际超时的精度将随着指定超时的十进制精度增加而降低,另请参见-m, -max time选项,如果多次使用此选项,将使用最后一个选项。
  • --create-dirs: 当与-o选项结合使用时,curl将根据需要创建必要的本地目录层次结构,此选项创建与-o选项一起提到的dir,而不是其他选项,如果-o文件名不使用dir,或者它提到的dir已经存在,则不会创建dir,要在使用FTPSFTP时创建远程目录,请尝试--FTP create dirs
  • --crlf: FTP,上传时将LF转换为CRLF,适用于MVS (OS/390)
  • --crlfile <file>: HTTPS/FTPS,提供一个使用PEM格式的文件,其中包含一个证书吊销列表,该列表可以指定要被视为吊销的对等证书,如果多次使用此选项,将使用最后一个选项,在7.19.7增加。
  • -d, --data <data>: HTTP,将POST请求中指定的数据发送到HTTP服务器,就像用户填写HTML表单并按下submit按钮时浏览器所做的那样,这将导致curl使用内容类型application/x-www-form-urlencoded将数据传递给服务器,与-F, --form比较,-d, --data--data ascii相同,要发布纯二进制的数据,应该改用--data binary选项,要对表单字段的值进行URL编码,可以使用--data urlencode,如果这些选项中的任何一个在同一命令行上被多次使用,则指定的数据段将与分隔的&符号合并在一起,因此,使用-d name=daniel -d skill=lousy将生成一个类似name=daniel&skill=lousypost块,如果数据以@开头,其余的应该是从中读取数据的文件名,如果要从stdin读取数据,也可以指定多个文件,例如,从名为foobar的文件发布数据将使用--data@foobar完成,当--data被告知从这样的文件中读取时,回车符和换行符将被去除。
  • -D, --dump-header <file>: 将协议头写入指定的文件,当您想存储HTTP站点发送给您的头文件时,使用此选项非常方便,通过使用-b, -cookie选项,可以在第二次curl调用中读取来自头的cookie,但是,-c,-cookie jar选项是存储cookie的更好方法,在FTP中使用时,FTP服务器响应行被认为是headers,因此保存在那里,如果多次使用此选项,将使用最后一个选项。
  • --data-ascii <data>: 请参见-d, --data
  • --data-binary <data>: HTTP,这将完全按照指定的方式发布数据,无需任何额外处理,如果数据以@开头,其余的应该是文件名,数据的发布方式与--dataascii类似,只是保留了换行符和回车符,并且从不进行转换,如果多次使用此选项,则第一个选项后面的选项将附加-d, -data中所述的数据。
  • --data-urlencode <data>: HTTP,这会发布数据,与其他--data选项类似,但会执行URL编码,在7.18.0中添加,为了符合CGI<data>部分应以名称开头,后跟分隔符和内容规范,可以使用以下语法之一将<data>部分传递给curl:
    • content: 这将使curl URL编码内容并将其传递,请小心,使内容不包含任何=@符号,因为这将使语法与以下其他情况之一匹配。
    • =content: 这将使curl URL-encode编码内容并将其传递,前面的=符号不包括在数据中。
    • name=content: 这将使curl URL编码内容部分并将其继续传递,请注意,名称部分应该已经过URL编码。
    • @filename: 这将使卷曲加载来自给定文件(包括任何换行符)的数据,对该数据进行URL编码并在POST中传递。
    • name@filename: 这将使curl从给定的文件(包括任何换行符)加载数据,URL对该数据进行编码并在POST中传递,名称部分附加了一个等号,结果是name=urlencoded文件内容,注意,名称应该已经是URL编码的。
  • --delegation LEVEL: 设置LEVEL,告诉服务器在处理用户凭据时允许委托什么,通常与GSS/kerberos一起使用。
    • none: 不允许任何授权。
    • policy: 委托当且仅当Kerberos服务票证中设置了OK-AS-DELEGATE标志时,这是领域策略的问题。
    • always: 无条件地允许服务器进行委托。
  • --digest: HTTP,启用HTTP摘要身份验证,这是一种身份验证方案,可防止密码以明文形式通过有线发送,将此选项与正常的-u, -user选项结合使用,以设置用户名和密码,如果多次使用此选项,则只使用第一个选项。
  • --disable-eprt: FTP,告诉curl在执行活动FTP传输时禁用EPRTLPRT命令,curl通常会首先尝试使用EPRT,然后在使用PORT之前使用LPRT,但是有了这个选项,它会立即使用PORTEPRTLPRT是原始FTP协议的扩展,可能无法在所有服务器上工作,但它们以比传统的PORT命令更好的方式实现了更多功能,--eprt可以用来再次显式地启用eprt,并且--no eprt--disable eprt的别名,禁用EPRT只会更改活动行为,如果要切换到被动模式,则不需要使用-P, -ftp端口或强制使用-ftp pasv
  • --dns-interface <interface>: 告诉curl通过<interface>发送传出的DNS请求,此选项对应于--interface(不影响DNS),提供的字符串必须是接口名称(不是地址),此选项要求libcurl是使用支持此操作的解析器后端构建的,c-ares后端是唯一这样的,在7.33.0中添加。
  • --dns-ipv4-addr <ip-address>: 告诉curl在发出ipv4dns请求时绑定到<ip address>,以便DNS请求源自此地址,参数应为单个IPv4地址,此选项要求libcurl是使用支持此操作的解析器后端构建的,c-ares后端是唯一这样的,在7.33.0中添加。
  • --dns-ipv6-addr <ip-address>: 在发出ipv6dns请求时,告诉curl绑定到<ip address>,以便DNS请求源自此地址,参数应为单个IPv6地址,此选项要求libcurl是使用支持此操作的解析器后端构建的,c-ares后端是唯一这样的,在7.33.0中添加。
  • --dns-servers <ip-address,ip-address>: 设置要使用的DNS服务器列表,而不是系统默认值,IP地址列表应以逗号分隔,端口号也可以选择在每个IP地址后给出<Port number>,此选项要求libcurl是使用支持此操作的解析器后端构建的,c-ares后端是唯一这样的,在7.33.0中添加。
  • -e, --referer <URL>: HTTP,将referer Page信息发送到HTTP服务器,当然,这也可以用-H, -header标志来设置,当与-L, -location一起使用时,您可以在--referer URL后面附加; auto,使curllocation:header后面自动设置上一个URLauto字符串可以单独使用,即使您没有设置初始--referer,如果多次使用此选项,将使用最后一个选项。
  • -E, --cert <certificate[:password]>: SSL,告诉curl在使用HTTPSFTPS或其他基于SSL的协议获取文件时使用指定的客户端证书文件,如果使用安全传输,证书必须为PKCS#12格式,如果使用任何其他引擎,证书必须为PEM格式,如果未指定可选密码,将在终端上查询该密码,注意,这个选项假设一个certificate是私钥和私钥连接在一起的,请参见--cert--key以独立地指定它们。
  • --engine <name>: 选择用于密码操作的OpenSSL加密引擎,使用--engine list打印构建时支持的引擎的列表,请注意,并非所有engine在运行时都可用。
  • --environment: RISC OS ONLY,使用-w选项支持的名称设置一系列环境变量,以便在运行curl之后更容易地提取有用的信息。
  • --egd-file <file>: SSL,指定守护进程套接字的路径名,套接字用于为SSL连接的随机引擎播种,另请参见--random file选项。
  • --cert-type <type>: SSL,告诉curl提供的证书是什么类型的证书,PEMDERENG是公认的类型,如果未指定,则假定为PEM,如果多次使用此选项,将使用最后一个选项。
  • --cacert <CA certificate>: SSL,告诉curl使用指定的证书文件来验证对等方,文件可能包含多个CA证书,证书必须采用PEM格式,通常情况下,curl是使用默认文件构建的,因此此选项通常用于更改默认文件。
  • --capath <CA certificate directory>: SSL,告诉curl使用指定的证书目录来验证对等方,可以通过使用:分隔多条路径,例如path1:path2:path3,证书必须是PEM格式的,如果curl是基于OpenSSL构建的,那么目录必须使用OpenSSL提供的c_rehash程序进行处理,如果--cacert文件包含许多CA证书,那么使用--capath可以使OpenSSL支持的curl比使用--cacert更有效地建立SSL连接。如果设置了此选项,将忽略默认的capath值,如果多次使用,将使用最后一个值。
  • -f, --fail: HTTP,服务器错误时无提示失败,即完全没有输出,这样做主要是为了更好地使脚本等更好地处理失败的尝试,在正常情况下,当HTTP服务器无法传递文档时,它会返回一个HTML文档,通常会描述原因,此标志将阻止curl输出该值并返回错误22,这种方法不是故障安全的,有时会出现不成功的响应代码,特别是在涉及身份验证时,例如响应代码401407
  • -F, --form <name=content>: HTTP,这使得curl可以模拟用户按下submit按钮的填充表单,curl根据rfc2388使用内容类型multipart/form数据发布数据,这样就可以上传二进制文件等,若强制内容部分成为文件,在文件名前面加上@符号,若要仅从文件中获取内容部分,请在文件名前面加上<符号,@<之间的区别是@使一个文件作为文件上传附加到post中,而<使一个文本字段从一个文件中获取该文本字段的内容。
  • --ftp-account [data]: FTP,当FTP服务器在提供用户名和密码后请求account data时,使用ACCT命令发送该数据,在7.13.0中添加,如果多次使用此选项,将使用最后一个选项。
  • --ftp-alternative-to-user <command>: FTP,如果与用户的身份验证和PASS命令失败,则发送此命令,当使用客户端证书通过FTPS连接到Tumbleweed的安全传输服务器时,使用SITE AUTH将告诉服务器从证书中检索用户名,在7.15.5增加。
  • --ftp-create-dirs: FTP/SFTP,当FTPsftp url/操作使用服务器上当前不存在的路径时,curl的标准行为是失败,使用此选项,curl将尝试创建丢失的目录。
  • --ftp-method [method]: FTP,控制curl应该使用什么方法访问FTP(S)服务器上的文件,在7.15.1添加,方法参数应该是以下选项之一:
    • multicwd: curl对给定URL中的每个路径部分执行一个CWD操作,对于深层层次结构,这意味着有很多命令,RFC1738就是这么说明的,这是默认但最慢的行为。
    • nocwd: curl根本不做CWDcurl将执行SIZERETRSTOR等操作,并为所有这些命令提供到服务器的完整路径,这是最快的行为。
    • singlecwd: curl对完整的目标目录执行一个CWD,然后正常地对文件进行操作,就像multicwd一样,这比nocwd更符合标准,但没有multicwd的全部处理。
  • --ftp-pasv: FTP,数据连接使用被动模式,被动是内部默认行为,但使用此选项可用于覆盖以前的-P/-ftp端口选项,在7.11.0中添加,如果多次使用此选项,则只使用第一个选项,撤消强制的被动端口确实是不可行的,但是您必须再次强制执行正确的-P, --ftp端口,被动模式意味着curl将首先尝试EPSV命令,然后再尝试PASV,除非使用--disable EPSV
  • --ftp-skip-pasv-ip: FTP,当curl连接数据连接时,告诉curl不要使用服务器在响应curlPASV命令时建议的IP地址,相反,curl将重用它已经用于控制连接的相同IP地址,在7.14.2增加,如果使用PORTEPRTEPSV代替PASV,则此选项无效。
  • --ftp-pret: FTP,告诉curlPASVEPSV之前发送PRET命令,某些FTP服务器(主要是drftpd)需要这个非标准的命令来显示目录列表,以及在PASV模式下进行更新和下载,在7.20.x中添加。
  • --ftp-ssl-ccc: FTP,使用CCC(清除命令通道)在验证后关闭SSL/TLS层,控制信道通信的其余部分将是未加密的,这允许NAT路由器跟踪FTP事务,默认模式为被动模式,其他模式请参见--ftp ssl ccc mode,在7.16.1增加。
  • --ftp-ssl-ccc-mode [active/passive]: FTP,使用CCC(清除命令通道)设置CCC模式,被动模式不会启动关闭,而是等待服务器执行,并且不会从服务器回复关闭,活动模式启动关机并等待服务器的回复,7.16.2增加。
  • --ftp-ssl-control: FTPFTP登录需要SSL/TLS,清除以进行传输,允许安全的身份验证,但非加密的数据传输效率,如果服务器不支持SSL/TLS,则传输失败,在7.16.0中添加,目前仍然可以使用,但将在将来的版本中删除。
  • --form-string <name=string>: HTTP,类似于--form,只是命名参数的值字符串是按字面意思使用的,值中的前导@<字符以及; type=字符串没有特殊含义,如果字符串值可能意外触发--form的’@‘或’<‘特性,请优先使用--form
  • -g, --globoff: 此选项关闭URL globbing解析器,设置此选项时,可以指定包含字母{}[]URL,而无需curl本身对其进行解释,请注意,这些字母不是正常的合法URL内容,但它们应该根据URI标准进行编码。
  • -G, --get: 使用此选项时,将使用-d-data-data binary-data urlencode指定的所有数据在HTTP GET请求中使用,而不是在其他情况下使用的POST请求,数据将附加到带有?URL中分离器,如果与-I结合使用,POST数据将被附加到带有HEAD请求的URL中,如果多次使用此选项,则只使用第一个选项,这是因为撤消GET没有意义,但是您应该执行您喜欢的替代方法。
  • -H, --header <header>: HTTP,向服务器发送HTTP时请求中包含的额外头,您可以指定任意数量的额外标头,请注意,如果您应该添加一个与curl将使用的内部头具有相同名称的自定义头,那么将使用外部设置的头而不是内部头,这使得你可以做比curl更复杂的东西,您不应该在不完全清楚自己在做什么的情况下替换内部设置的头文件,通过在冒号的右侧提供一个没有内容的替换来删除内部标题,如: -H Host:,如果发送没有值的自定义标头,则其标头必须以分号结尾,例如-H X-custom-header;以发送X-custom-header:curl将确保您添加/替换的每个标题都使用正确的行尾标记发送,因此您不应将其添加为标题内容的一部分:不要添加换行符或回车符,它们只会为您带来麻烦,另请参见-A, --user-agent-e, --referer选项。
  • --hostpubmd5 <md5>: SCP/SFTP,传递包含32个十六进制数字的字符串,字符串应该是远程主机公钥的128MD5校验和,除非md5 sums匹配,否则curl将拒绝与主机的连接,在7.17.1增加。
  • --ignore-content-length: HTTP,忽略内容长度标题,这对于运行Apache1.x的服务器尤其有用,后者将报告大于2G的文件的不正确内容长度。
  • -i, --include: HTTP,在输出中包括HTTP头,HTTP头包括服务器名称、文档日期、HTTP版本等内容。
  • -I, --head: HTTP/FTP/FILE,仅获取HTTPHTTP服务器的特点是响应头,它只用来获取文档的头,当用于FTP或文件时,curl仅显示文件大小和上次修改时间。
  • --interface <name>: 使用指定的接口执行操作,您可以输入接口名、IP地址或主机名,例如: curl—接口eth0:1 http://www.netscape.com/如果多次使用此选项,将使用最后一个选项。
  • -j, --junk-session-cookies: HTTP,当curl被告知从给定文件读取cookies时,此选项将使其放弃所有会话cookies,这将基本上具有与启动新会话相同的效果,典型的浏览器总是在关闭会话cookie时丢弃它们。
  • -J, --remote-header-name: HTTP,此选项告诉-O, -remote name选项使用服务器指定的内容配置文件名,而不是从URL提取文件名,在提供的文件名中还没有尝试解码%-序列,因此此选项可能会为您提供意外的文件名。
  • -k, --insecure: SSL,这个选项显式地允许curl执行不安全的SSL连接和传输,所有SSL连接都试图通过使用默认安装的CA证书捆绑包来确保安全,这使得所有被认为是不安全的连接失败,除非使用-k, -unsecure
  • -K, --config <config file>: 指定从哪个配置文件读取curl参数,配置文件是一个文本文件,可以在其中写入命令行参数,然后使用这些参数,就像它们被写入实际的命令行一样,选项及其参数必须在同一配置文件行中指定,并用空格、冒号或等号分隔,可以选择在配置文件中给出长选项名,而不使用初始双破折号,如果是这样,冒号或等号字符可以用作分隔符,如果使用一个或两个破折号指定选项,则选项与其参数之间不能有冒号或等号字符,如果参数要包含空格,则参数必须用引号括起来,在双引号中,下列转义序列可用: \\\"\t\n\r\v,任何其他字母前面的反斜杠将被忽略,如果配置行的第一列是#字符,则该行的其余部分将被视为注释,在配置文件中,每个物理行只写一个选项,将文件名指定为-K, --config-,使curlstdin读取文件。
  • --keepalive-time <seconds>: 此选项设置在发送keepalive探测之前连接需要保持空闲的时间以及各个keepalive探测之间的时间,它目前在提供TCP_KEEPIDLETCP_KEEPINTVL套接字选项的操作系统上非常有效(指Linux、最近的AIXHP-UX等),如果使用--no keepalive,则此选项无效,(在7.18.0中添加)如果多次使用此选项,将使用最后一个选项,如果未指定,则该选项默认为60秒。
  • --key <key>: SSL/SSH,私钥文件名,允许您在此单独的文件中提供私钥,如果多次使用此选项,将使用最后一个选项。
  • --key-type <type>: SSL,私钥文件类型,指定--key提供的私钥是哪种类型,支持DERPEMENG,如果未指定,则假定为PEM,如果多次使用此选项,将使用最后一个选项。
  • --krb <level>: FTP,启用Kerberos身份验证和使用,必须输入级别,并且级别应为clearsafesecretaryprivate之一,如果您使用的级别不是这些级别之一,则将改用private,此选项需要使用kerberos4支持构建的库,这并不常见,使用-V, -version查看卷曲是否支持它,如果多次使用此选项,将使用最后一个选项。
  • -l, --list-only: FTP,列出FTP目录时,此开关强制使用仅名称视图,如果用户希望机器解析FTP目录的内容,这尤其有用,因为普通目录视图不使用标准的外观或格式,这样使用时,该选项将导致向服务器发送NLST命令,而不是LIST,注意: 一些FTP服务器在响应NLST时只列出文件,它们不包括子目录和符号链接,POP3POP3检索特定电子邮件时,此开关强制执行LIST命令而不是RETR,如果用户希望查看服务器上是否存在特定的消息id以及它的大小,那么这一点特别有用,注意: 当与-X, -request<command>组合使用时,此选项可用于发送UIDL命令,因此用户可以使用电子邮件的唯一标识符而不是其消息id来发出请求,在7.21.5增加。
  • -L, --location: HTTP/HTTPS,如果服务器报告请求的页面已移动到其他位置(用location:header3XX响应代码表示),此选项将使curl在新位置上重做请求,如果与-i, --include-i, --head一起使用,将显示所有请求页面的标题,使用身份验证时,curl只将其凭据发送到初始主机,如果重定向将curl带到另一个主机,它将无法截获用户+密码,另请参见--location trusted,了解如何更改此设置,您可以使用--max redirs选项来限制要遵循的重定向数量,当curl遵循重定向并且请求不是纯GET(例如POSTPUT)时,如果HTTP响应是301302303,它将使用GET执行以下请求,如果响应代码是任何其他3xx代码,curl将使用相同的未修改方法重新发送以下请求,您可以告诉curl不要更改non-GET请求方法,以便在30x响应之后使用专用选项--post301-post302-post303获取。
  • --libcurl <file>: 将此选项附加到任何普通的curl命令行,您将获得一个libcurl,它使用C源代码编写到文件中,执行与命令行操作相同的操作!如果多次使用此选项,将使用最后给定的文件名,7.16.1增加。
  • --limit-rate <speed>: 指定您希望curl使用的最大传输速率-用于下载和上载,如果您有一个有限的管道,并且希望您的传输不使用整个带宽,则此功能非常有用,使它比其他情况下慢,给定的速度以字节/秒为单位,除非附加后缀,加上kk将把数字计为千字节,mm表示兆字节,而gg表示千兆字节,例如: 200K3m1G,给定的速率是整个传输过程中计算的平均速度,这意味着curl可能在短脉冲中使用更高的传输速度,但随着时间的推移,它使用的传输速度不会超过给定的速率,如果您还使用-Y, -speed limit选项,则该选项将优先,并可能略微削弱速率限制,以帮助保持速度限制逻辑正常工作,如果多次使用此选项,将使用最后一个选项。
  • --local-port <num>[-num]: 设置用于连接的本地端口号的首选数目或范围,请注意,端口号本质上是一种稀缺资源,有时会很忙,因此将此范围设置为太窄可能会导致不必要的连接设置失败,在7.15.2增加。
  • --location-trusted: HTTP/HTTPS,与-L, --location类似,但允许向站点可能重定向到的所有主机发送名称+密码,如果站点将您重定向到要向其发送身份验证信息的站点(在HTTP基本身份验证的情况下是明文),则这可能会或可能不会导致安全漏洞。
  • -m, --max-time <seconds>: 允许整个操作所用的最长时间(秒),这有助于防止批处理作业因网络或链接运行缓慢而挂起数小时,自7.32.0以来,此选项接受十进制值,但实际超时的精度将随着指定超时的十进制精度增加而降低,另请参见--connect timeout选项,如果多次使用此选项,将使用最后一个选项。
  • --login-options <options>: 指定服务器身份验证期间要使用的登录选项,您可以使用登录选项指定身份验证期间可能使用的特定于协议的选项,目前只有IMAPPOP3SMTP支持登录选项,有关登录选项的更多信息,请参阅RFC 2384RFC 5092IETF草稿draft-earhart-url-smtp-00.txt(在7.34.0中添加),如果多次使用此选项,将使用最后一个选项。
  • --mail-auth <address>: SMTP,指定单个地址,这将用于指定正在中继到另一个服务器的已提交邮件的身份验证地址(标识),在7.25.0中添加。
  • --mail-from <address>: SMTP,指定发送给定邮件的单一地址,在7.20.0中添加。
  • --max-filesize <bytes>: 指定要下载的文件的最大大小(以字节为单位),如果请求的文件大于这个值,传输将不会开始,curl将返回退出代码63,注意:文件大小在下载之前并不总是已知的,对于这样的文件,即使文件传输最终超过这个给定的限制,这个选项也不起作用,这涉及到FTPHTTP传输。
  • --mail-rcpt <address>: (SMTP)指定单个地址、用户名或邮件列表名称,在执行邮件传输时,收件人应指定要将邮件发送到的有效电子邮件地址,(在7.20.0中添加)执行地址验证(VRFY命令)时,应将收件人指定为用户名或用户名和域(根据RFC53213.5节),(在7.34.0中添加)在执行邮件列表扩展(EXPN命令)时,应该使用邮件列表名称指定收件人,例如FriendsLondon Office,在7.34.0中添加。
  • --max-redirs <num>: 设置允许的最大重定向次数,如果使用-L, --location,这个选项可以用来防止curl不断地遵循重定向,默认情况下,限制设置为50个重定向,将此选项设置为-1以使其无限,如果多次使用此选项,将使用最后一个选项。
  • --metalink: 此选项可以告诉curl将给定的URI作为Metalink文件进行解析和处理(支持版本3和版本4(RFC 5854)),并在出现错误(例如文件或服务器不可用)时使用中列出的镜像进行故障转移,它还将在下载完成后验证文件的哈希值,Metalink文件本身在内存中下载和处理,而不是存储在本地文件系统中。
  • -n, --netrc: 使curl扫描用户主目录中的.netrc(netrc on Windows)文件以获取登录名和密码,这通常用于UNIX上的FTP,如果与HTTP一起使用,curl将启用用户身份验证,有关文件格式的详细信息,请参阅netrc(4)ftp(1),如果文件没有正确的权限,curl不会报错,环境变量HOME用于查找主目录,一个快速且非常简单的示例,说明如何设置.netrc以允许curl通过FTP传输到机器host.domain.com网站用户名为myself和密码为secret的应类似于:机器host.domain.com网站登录密码密码。
  • -N, --no-buffer: 禁用输出流的缓冲,在正常的工作环境中,curl将使用一个标准的缓冲输出流,它将以块的形式输出数据,而不一定是在数据到达时,使用此选项将禁用该缓冲,请注意,这是已记录的否定选项名称,因此,可以使用--buffer来强制执行缓冲。
  • --netrc-file: 此选项类似于--netrc,只是您提供了curl应该使用的netrc文件的路径(绝对或相对),每次调用只能指定一个netrc文件,如果提供了多个--netrc文件选项,则只使用最后一个选项,(7.21.5增加)此选项会覆盖--netrc的任何用法,因为它们是互斥的,如果指定,它还将遵循--netrc optional
  • --netrc-optional: 与--netrc非常相似,但此选项使.netrc的用法成为可选的,而不是像--netrc选项那样是强制性的。
  • --negotiate: HTTP,启用协商(SPNEGO)身份验证,如果要为代理身份验证启用协商(SPNEGO),请使用--proxy Negotiate,此选项需要使用GSS-APISSPI支持构建的库,使用-V, -version查看curl是否支持GSS-API/SSPISPNEGO,使用此选项时,还必须提供假-u, -user选项以正确激活身份验证代码,发送-u就足够了,因为实际上没有使用-u选项中的用户名和密码,如果多次使用此选项,则只使用第一个选项。
  • --no-keepalive: 禁用在TCP连接上使用keepalive消息,因为默认情况下curl会启用它们,请注意,这是已记录的否定选项名称,因此,可以使用--keepalive来强制执行keepalive
  • --no-sessionid: SSL,禁用curlSSL会话ID缓存的使用,默认情况下,所有传输都使用缓存完成,请注意,尽管尝试重用SSL会话id不会对任何事情造成伤害,但在野外似乎存在损坏的SSL实现,可能需要您禁用它才能成功,(在7.16.0中添加)请注意,这是已记录的否定选项名称,因此,您可以使用--sessionid来强制执行会话ID缓存。
  • --noproxy <no-proxy-list>: 不使用代理(如果指定了代理)的主机的逗号分隔列表,唯一的通配符是一个*字符,它匹配所有主机,并有效地禁用代理,此列表中的每个名称都匹配为包含主机名的域或主机名本身,例如,本地网站将匹配本地网站,7.19.4中增加。
  • --ntlm: HTTP,启用NTLM身份验证,NTLM身份验证方法是由Microsoft设计的,用于IIS web服务器,它是一个专有的协议,由聪明的人逆向设计,并根据他们的努力在curl中实现,这种行为不应该被认可,您应该鼓励每个使用NTLM的人转而使用公共的和文档化的身份验证方法,比如Digest,如果要为代理身份验证启用NTLM,请使用--proxy NTLM,此选项需要使用SSL支持构建的库,使用-V, -version查看curl是否支持NTLM,如果多次使用此选项,则只使用第一个选项。
  • -o, --output <file>: 将输出写入<file>而不是标准输出,如果使用{}[]获取多个文档,则可以在<file>说明符中使用#后跟数字,该变量将替换为正在获取的URL的当前字符串。
  • -O, --remote-name: 将输出写入名为的本地文件,就像我们得到的远程文件一样,仅使用远程文件的文件部分,路径被切断,用于保存的远程文件名是从给定的URL提取的,而不是从其他URL提取的,因此,文件将保存在当前工作目录中,如果要将文件保存在其他目录中,请确保在使用-O, -remote name标志调用curl之前更改当前工作目录,没有对文件名执行URL解码,如果名称中有%20或其他URL编码的部分,它们将以文件名的形式结束,您可以使用此选项的次数与您拥有的URL数量相同。
  • --oauth2-bearer: IMAP、POP3、SMTP,指定OAUTH 2.0服务器身份验证的承载令牌,承载令牌与用户名一起使用,用户名可以指定为--url-u, -user选项的一部分,承载令牌和用户名根据rfc6750格式化,如果多次使用此选项,将使用最后一个选项。
  • --proxy-header <header>: HTTP,向代理发送HTTP时请求中包含的额外头,您可以指定任意数量的额外标头,这是与-H, -header等效的选项,但仅适用于代理通信,就像在连接请求中一样,当您希望将单独的头发送到代理时,它将发送到实际的远程主机,curl将确保您添加/替换的每个标题都使用正确的行尾标记发送,因此您不应将其添加为标题内容的一部分:不要添加换行符或回车符,它们只会为您带来麻烦,使用此选项指定的头不会包含在curl知道不会发送到代理的请求中,此选项可多次用于添加/替换/删除多个标头,在7.37.0中添加。
  • -p, --proxytunnel: 当使用HTTP代理(-x, --proxy)时,此选项将导致非HTTP协议尝试通过代理进行隧道传输,而不是仅使用它来执行类似HTTP的操作,隧道方法是通过HTTP代理连接请求来实现的,并且要求代理允许直接连接到curl希望通过隧道连接到的远程端口号。
  • -P, --ftp-port <address>: FTP,在连接FTP时反转默认的发起程序/侦听程序角色,此开关使curl使用活动模式,在实践中,curl然后告诉服务器连接回客户机指定的地址和端口,而被动模式则要求服务器设置一个IP地址和端口以供连接。
  • --pass <phrase>: SSL/SSH,私钥的密码短语,如果多次使用此选项,将使用最后一个选项。
  • --post301: HTTP,告诉curl遵守rfc2616/10.3.2,在执行301重定向时不要将POST请求转换为GET请求,非RFC行为在web浏览器中无处不在,因此curl默认情况下进行转换以保持一致性,然而,服务器可能需要在这样的重定向之后保持POST,此选项仅在使用-L, -location(在7.17.1中添加)时才有意义。
  • --post302: HTTP,告诉curl遵守rfc2616/10.3.2,在执行302重定向时不要将POST请求转换为GET请求,非RFC行为在web浏览器中无处不在,因此curl默认情况下进行转换以保持一致性,然而,服务器可能需要在这样的重定向之后保持POST,此选项仅在使用-L, -location(在7.19.1中添加)时才有意义。
  • --post303: HTTP,告诉curl遵守rfc2616/10.3.2,在执行303重定向时不要将POST请求转换为GET请求,非RFC行为在web浏览器中无处不在,因此curl默认情况下进行转换以保持一致性,然而,服务器可能需要在这样的重定向之后保持POST,此选项仅在使用-L, -location(在7.26.0中添加)时才有意义。
  • --proto <protocols>: 告诉curl使用列出的协议进行初始检索,协议从左到右求值,以逗号分隔,每个协议都是一个协议名或all,可以选择以零个或多个修饰符作为前缀。
  • --proto-redir <protocols>: 告诉curl在重定向后使用列出的协议,有关协议的表示方式,请参见--proto,(7.20.2增加)。
  • --proxy-anyauth: 告诉curl在与给定代理通信时选择合适的身份验证方法,这可能会导致额外的请求/响应往返,(7.13.2增加)。
  • --proxy-basic: 告诉curl在与给定代理通信时使用HTTP基本身份验证,使用--basic对远程主机启用HTTP basicBasiccurl用于代理的默认身份验证方法。
  • --proxy-digest: 告诉curl在与给定代理通信时使用HTTP摘要身份验证,使用--digest对远程主机启用HTTP摘要。
  • --proxy-negotiate: 告诉curl在与给定代理通信时使用HTTP协商(SPNEGO)身份验证,使用--negotiate启用与远程主机的HTTP协商(SPNEGO),7.17.1增加。
  • --proxy-ntlm: 告诉curl在与给定代理通信时使用httpntlm身份验证,使用--ntlm启用远程主机的ntlm
  • --proxy1.0 <proxyhost[:port]>: 使用指定的HTTP 1.0代理,如果未指定端口号,则假定在端口1080处,此选项与HTTP proxy选项-x, --proxy之间的唯一区别是,尝试通过代理使用CONNECT将指定HTTP 1.0协议,而不是默认的HTTP 1.1
  • --pubkey <key>: SSH,公钥文件名,允许您在此单独的文件中提供公钥,如果多次使用此选项,将使用最后一个选项。
  • -q: 如果用作命令行上的第一个参数,则不会读取和使用curlrc config文件,有关默认配置文件搜索路径的详细信息,请参见-K, --config
  • -Q, --quote <command>: FTP/SFTP,向远程FTPSFTP服务器发送任意命令,Quote命令在传输发生之前发送(确切地说,是在FTP传输中的初始PWD命令之后),若要使命令在成功传输后执行,请在其前面加一个短划线-,要使命令在curl更改工作目录后发送,就在传输命令之前,在命令前面加上+(这仅适用于FTP),您可以指定任意数量的命令,如果服务器返回其中一个命令失败,则整个操作将中止,必须按照RFC 959的定义将语法正确的FTP命令发送到FTP服务器,或将下面列出的命令之一发送到SFTP服务器,此选项可以多次使用,在与FTP服务器通信时,在命令前面加一个星号*,使curl即使失败也能继续,因为默认情况下,curl会在第一次失败时停止,SFTP是一种二进制协议,与FTP不同,curl在将SFTP quote命令发送到服务器之前会自己解释它们,文件名可以用shell样式引用以嵌入空格或特殊字符。
  • -r, --range <range>: HTTP/FTP/SFTP/FILE,从HTTP/1.1FTPSFTP服务器或本地文件检索字节范围(即部分文档),可以通过多种方式指定范围。
  • -R, --remote-time: 使用时,这将使curl尝试找出远程文件的时间戳,如果该时间戳可用,则使本地文件获得相同的时间戳。
  • --random-file <file>: SSL,指定包含随机数据的文件的路径名,数据用于为SSL连接的随机引擎播种,另请参见--egd文件选项。
  • --raw: HTTP,使用时,它会禁用所有内容或传输编码的内部HTTP解码,而是让它们原封不动地传递,7.16.2增加。
  • --remote-name-all: 此选项将更改所有给定URL的默认操作,使其处理方式与每个URL使用-O-remote name一样,因此,如果要在使用--remote name all之后对特定URL禁用该选项,则必须使用-o---no remote name,在7.19.0中添加。
  • --resolve <host:port:address>: 为特定主机和端口对提供自定义地址,使用此方法,可以使curl请求使用指定的地址,并防止使用通常解析的地址,将其视为命令行上提供的一种/etc/hosts替代方案,端口号应该是用于主机将用于的特定协议的编号,这意味着,如果要为同一主机提供不同端口的地址,则需要多个条目,可以多次使用此选项添加许多要解析的主机名,在7.21.3增加。
  • --retry <num>: 如果curl尝试执行传输时返回暂时性错误,它将在放弃之前重试此次数,将数字设置为0将使curl不重试(这是默认值),瞬时错误表示:超时、ftp4xx响应代码或http5xx响应代码,当curl将要重试传输时,它将首先等待一秒钟,然后对于所有即将进行的重试,它将加倍等待时间,直到达到10分钟,这将是其余重试之间的延迟,通过使用--retry delay可以禁用这个指数退避算法,另请参见--retry max time以限制允许重试的总时间,(7.12.3增加)如果多次使用此选项,将使用最后一个选项。
  • --retry-delay <seconds>: 当传输因暂时性错误而失败时,在每次重试之前使curl休眠此时间量(它会更改重试之间的默认退避时间算法),只有同时使用--retry时,此选项才有意义,将此延迟设置为零将使curl使用默认回退时间,(7.12.3增加)如果多次使用此选项,将使用最后一个选项。
  • --retry-max-time <seconds>: 重试计时器在第一次传输尝试之前重置,只要计时器没有达到这个给定的限制,重试就会照常进行(请参阅--retry),请注意,如果计时器尚未达到限制,则会发出请求,并且在执行时,可能需要比给定的时间段更长的时间,要限制单个请求的最长时间,请使用-m, -max time,将此选项设置为零以不超时重试,(7.12.3增加)如果多次使用此选项,将使用最后一个选项。
  • -s, --silent: 安静或安静模式,不显示进度表或错误消息,使卷发静音,它仍然会输出您请求的数据,甚至可能输出到终端/stdout,除非您重定向它。
  • --sasl-ir: 在SASL身份验证中启用初始响应,在7.31.0增加。
  • -S, --show-error: 当与-s一起使用时,如果curl失败,它将显示一条错误消息。
  • --ssl: FTP, POP3, IMAP, SMTP,尝试使用SSL/TLS进行连接,如果服务器不支持SSL/TLS,则还原为非安全连接,另请参见--ftp ssl control--ssl reqd以了解所需的不同加密级别,(在7.20.0中添加)此选项以前称为--ftp ssl(在7.11.0中添加),该选项名称仍可以使用,但将在将来的版本中删除。
  • --ssl-reqd: FTP, POP3, IMAP, SMTP,连接需要SSL/TLS,如果服务器不支持SSL/TLS,则终止连接,(在7.20.0中添加)此选项以前称为--ftp ssl reqd(在7.15.5中添加),该选项名称仍可以使用,但将在将来的版本中删除。
  • --ssl-allow-beast: SSL,此选项告诉curl不要绕过SSL3TLS1.0协议中称为BEAST的安全缺陷,如果不使用此选项,SSL层可能会使用已知的解决方法来解决某些较旧的SSL实现的互操作性问题,警告:此选项会降低SSL安全性,通过使用此标志,您会要求完全相同的安全性,在7.25.0中添加。
  • --socks4 <host[:port]>: 使用指定的SOCKS4代理,如果未指定端口号,则假定在端口1080处,(7.15.2增加)此选项将覆盖以前使用的任何-x, --proxy,因为它们是互斥的,从7.21.7开始,此选项是多余的,因为您可以使用socks4://协议前缀指定具有-x, --proxysocks4代理,如果多次使用此选项,将使用最后一个选项。
  • --socks4a <host[:port]>: 使用指定的SOCKS4a代理,如果未指定端口号,则假定在端口1080处,(在7.18.0中添加)此选项将覆盖以前使用的任何-x, --proxy,因为它们是互斥的,从7.21.7开始,此选项是多余的,因为您可以使用socks4a://协议前缀指定具有-x, -proxysocks4a代理,如果多次使用此选项,将使用最后一个选项。
  • --socks5-hostname <host[:port]>: 使用指定的SOCKS5代理(并让代理解析主机名),如果未指定端口号,则假定在端口1080处,(在7.18.0中添加)此选项将覆盖以前使用的任何-x, --proxy,因为它们是互斥的,从7.21.7开始,此选项是多余的,因为您可以使用socks5h://协议前缀指定带有-x, -proxysocks5主机名代理,如果多次使用此选项,将使用最后一个选项,(此选项以前被错误地记录并用作--socks,但没有附加数字)。
  • --socks5 <host[:port]>: 使用指定的SOCKS5代理-但在本地解析主机名,如果未指定端口号,则假定在端口1080处,此选项将覆盖以前使用的任何-x, --proxy,因为它们是互斥的,从7.21.7开始,此选项是多余的,因为您可以使用socks5://协议前缀指定带有-x, -proxysocks5代理,如果多次使用此选项,将使用最后一个选项,(此选项以前被错误地记录并用作--socks,但没有附加数字),此选项(以及--socks4)不适用于IPV6FTPSLDAP
  • --socks5-gssapi-service <servicename>: socks服务器的默认服务名称是rcmd/server fqdn,此选项允许您更改它,示例: ---socks5 proxy name--socks5 gssapi service sockd将使用sockd/proxy name--socks5 proxy name--socks5 gssapi service sockd/real name将在代理名称与主体名称不匹配的情况下使用sockd/real name,在7.19.4中增加。
  • --socks5-gssapi-nec: 作为GSS-API协商的一部分,将协商保护模式,RFC1961在第4.3/4.4节中说它应该受到保护,但NEC参考实施没有,选项--socks5 gssapi nec允许保护模式协商的无保护交换,在7.19.4中增加。
  • --stderr <file>: 将对stderr的所有写入重定向到指定的文件,如果文件名是一个普通的-,则改为写入标准输出,如果多次使用此选项,将使用最后一个选项。
  • -t, --telnet-option <OPT=val>: 将选项传递给telnet协议,支持的选项包括: TTYPE=<term>设置终端类型,XDISPLOC=<X display>设置X显示位置,NEW_ENV=<var, val>设置环境变量。
  • -T, --upload-file <file>: 这会将指定的本地文件传输到远程URL,如果指定的URL中没有文件部分,curl将附加本地文件名,请注意,您必须在最后一个目录上使用尾随/来真正证明curl没有文件名,否则curl会认为您的最后一个目录名是要使用的远程文件名,这很可能会导致上载操作失败,如果在HTTP(S)服务器上使用,则将使用PUT命令,使用文件名-来使用stdin而不是给定的文件,或者,可以指定文件名.(单个句点)而不是-,以便在非阻塞模式下使用stdin,以便在上载stdin时读取服务器输出。
  • --tcp-nodelay: 打开TCP_NODELAY选项,有关此选项的详细信息,请参阅curl_easy_setopt手册页,在7.11.2增加。
  • --tftp-blksize <value>: TFTP,设置TFTP BLKSIZE选项(必须大于512),这是curl在向TFTP服务器传输数据或从TFTP服务器传输数据时尝试使用的块大小,默认情况下,将使用512字节,如果多次使用此选项,将使用最后一个选项,在7.20.0中添加。
  • --tlsauthtype <authtype>: 设置TLS身份验证类型,目前,TLS-SRP(RFC 5054)唯一支持的选项是SRP,如果指定了--tlsuser--tlspassword,但未指定--tlsauthtype,则此选项默认为SRP,在7.21.4增加。
  • --tlspassword <password>: 设置密码以用于用--tlsauthtype指定的TLS身份验证方法,要求同时设置--tlsuser,在7.21.4增加。
  • --tlsuser <user>: 设置用户名以便与用--tlsauthtype指定的TLS身份验证方法一起使用,要求同时设置--tlspassword,在7.21.4增加。
  • --tlsv1.0: SSL,强制curl在与远程TLS服务器协商时使用TLS版本1.0,在7.34.0中添加。
  • --tlsv1.1: SSL,强制curl在与远程TLS服务器协商时使用TLS版本1.1,在7.34.0中添加。
  • --tlsv1.2: SSL,强制curl在与远程TLS服务器协商时使用TLS版本1.2,在7.34.0中添加。
  • --tr-encoding: HTTP,使用curl支持的算法之一请求压缩传输编码响应,并在接收数据时解压缩数据,在7.21.6增加。
  • --trace <file>: 启用所有传入和传出数据(包括描述性信息)到给定输出文件的完整跟踪转储,使用-作为文件名将输出发送到stdout,此选项覆盖以前使用的-v, -verbose-trace ascii,如果多次使用此选项,将使用最后一个选项。
  • --trace-ascii <file>: 启用所有传入和传出数据(包括描述性信息)到给定输出文件的完整跟踪转储,使用-作为文件名将输出发送到stdout,这与--trace非常相似,但是省略了十六进制部分,只显示转储的ASCII部分,它使较小的输出,可能更容易阅读未经训练的人,此选项覆盖以前使用的-v-verbose-trace,如果多次使用此选项,将使用最后一个选项。
  • --trace-time: 为curl显示的每个跟踪或详细行预先准备一个时间戳,在7.14.0中添加。
  • -u, --user <user:password>: 指定用于服务器身份验证的用户名和密码,重写-n-netrc--netrc可选,如果只指定用户名,curl将提示输入密码,用户名和密码在第一个冒号上分开,这样就不可能在用户名中使用带有此选项的冒号,密码仍然可以,将Kerberos V5与基于Windows的服务器一起使用时,应在用户名中包含Windows域名,以便服务器成功获取Kerberos票证,如果不这样做,那么初始身份验证握手可能会失败,当使用NTLM时,可以简单地将用户名指定为用户名,而不指定域。
  • -U, --proxy-user <user:password>: 指定用于代理身份验证的用户名和密码,如果您使用启用了Windows SSPIcurl二进制文件并进行协商或NTLM身份验证,那么您可以通过指定一个冒号来告诉curl从您的环境中选择用户名和密码,该冒号带有以下选项:-U,如果多次使用此选项,将使用最后一个选项。
  • --url <URL>: 指定要获取的URL,当您要在配置文件中指定URL时,此选项非常方便,此选项可以使用任意次数,要控制此URL的写入位置,请使用-o, --output-o, --remote name选项。
  • -v, --verbose: 输出详细信息,主要用于调试,以>开头的行表示curl发送的头数据,<表示curl接收的在正常情况下隐藏的头数据,以*开头的行表示curl提供的附加信息,请注意,如果您只希望在输出中使用HTTP头,那么您可能需要-i, -include选项,如果您认为此选项仍然不能提供足够的详细信息,请考虑改用--trace--trace ascii,此选项覆盖以前使用的--trace ascii--trace,使用-s, --silent使curl安静。
  • -w, --write-out <format>: 定义操作完成并成功后在标准输出上显示的内容,格式是一个字符串,可以包含纯文本和任意数量的变量,字符串可以指定为string,要从特定文件中读取,您可以将其指定为@filename,并告诉curlstdin中读取格式,您可以编写@-,输出格式中的变量将被curl认为合适的值或文本替换,如下所述,所有变量都指定为%{variable_name},要输出一个普通的%只需将它们写为%%,您可以使用\n、带\r的回车符和带\t的制表符来输出换行符,可能的值为content_typefilename_effectiveftp_entry_pathhttp_codehttp_connectlocal_iplocal_portnum_connectsnum_redirectsredirect_urlremote_ipremote_portsize_downloadsize_headersize_requestsize_uploadspeed_downloadspeed_uploadssl_verify_resulttime_appconnecttime_connecttime_namelookuptime_pretransfertime_redirecttime_starttransfertime_totalurl_effective
  • -x, --proxy <[protocol://][user:password@]proxyhost[:port]>: 使用指定的代理,可以使用protocol://前缀指定代理字符串,以指定备用代理协议,使用socks4://socks4a://socks5://socks5h://请求要使用的特定SOCKS版本,没有指定协议,http://和所有其他协议都将被视为http代理,(在curl7.21.7中添加了协议支持)如果代理字符串中未指定端口号,则假定端口号为1080,此选项将覆盖将代理设置为使用的现有环境变量,如果有环境变量设置代理,则可以将代理设置为以覆盖它,通过HTTP代理执行的所有操作都将透明地转换为HTTP,这意味着某些特定于协议的操作可能不可用,如果您可以通过代理进行隧道传输(如使用-p-proxytunnel选项时),则情况并非如此,代理字符串中可能提供的用户和密码由curl进行URL解码,这允许您通过使用%40传入特殊字符,如@,或用%3a传入冒号,可以使用与代理环境变量完全相同的方式指定代理主机,包括协议前缀(http://)和嵌入的用户+密码,如果多次使用此选项,将使用最后一个选项。
  • -X, --request <command>: HTTP,指定与HTTP服务器通信时要使用的自定义请求方法,将使用指定的请求,而不是使用其他方法(默认为GET),有关详细信息和解释,请阅读HTTP1.1规范,常见的附加HTTP请求包括PUTDELETE,但WebDAV等相关技术提供了PROPFINDCOPYMOVE等功能,通常你不需要这个选项,各种GETHEADPOSTPUT请求都是通过使用专用的命令行选项来调用的,此选项仅更改HTTP请求中使用的实际单词,不改变curl的行为方式,因此,例如,如果您想要发出一个正确的HEAD请求,那么使用-X HEAD将是不够的,你需要使用-I, -head选项。
  • --xattr: 将输出保存到文件时,此选项告诉curl将某些文件元数据存储在扩展文件属性中,当前,URL存储在xdg.origin.url属性,对于HTTP,内容类型存储在mime类型属性中,如果文件系统不支持扩展属性,将发出警告。
  • -y, --speed-time <time>: 如果在某个速度时间段内下载速度低于每秒的速度限制字节数,则下载将被中止,如果使用速度时间,则默认速度限制将为1,除非使用-Y设置,此选项控制传输,因此不会影响慢速连接等,如果您担心此问题,请尝试--connect timeout选项,如果多次使用此选项,将使用最后一个选项。
  • -Y, --speed-limit <speed>: 如果下载速度低于此给定速度(以字节/秒为单位)达数秒,则会中止下载,速度时间设置为-y,如果未设置,则为30,如果多次使用此选项,将使用最后一个选项。
  • -z, --time-cond <date expression>|<file>: (HTTP/FTP)请求在给定的时间和日期之后修改的文件,或在该时间之前修改的文件,<date expression>可以是各种日期字符串,或者如果它与任何内部字符串都不匹配,则将其作为文件名并尝试从<file>获取修改日期mtime,有关日期表达式的详细信息,请参阅getdate手册页,以破折号-开始日期表达式,使其请求比给定日期/时间早的文档,默认值是比指定日期/时间新的文档,如果多次使用此选项,将使用最后一个选项。
  • -h, --help: 输出帮助信息。
  • -M, --manual: 手动模式,显示详细的帮助文本。
  • -V, --version: 输出版本信息。

环境变量

使用环境变量设置代理与使用--proxy选项具有相同的效果。

  • http_proxy [protocol://]<host>[:port]: 设置用于HTTP的代理服务器。
  • HTTPS_PROXY [protocol://]<host>[:port]: 设置用于HTTPS的代理服务器。
  • [url-protocol]_PROXY [protocol://]<host>[:port]: 设置要用于[url protocol]的代理服务器,其中协议是curl支持的协议,并在url中指定,FTPFTPSPOP3IMAPSMTPLDAP等。
  • ALL_PROXY [protocol://]<host>[:port]: 如果未设置协议特定的代理,则设置要使用的代理服务器。
  • NO_PROXY <comma-separated list of hosts>: 不应通过任何代理的主机名列表,如果仅设置为星号*,则与所有主机匹配。

代理协议前缀

  • socks4://: 使其等效于--socks4
  • socks4a://: 使其相当于--socks4a
  • socks5://: 使其相当于--socks5
  • socks5h://: 使其相当于--socks5-hostname

退出代码

  • 1: 不支持的协议,curl的这个版本不支持这个协议。
  • 2: 初始化失败。
  • 3: URL格式不正确,语法不正确。
  • 4: 执行所需请求所需的功能或选项在生成时未启用或显式禁用,要使curl能够做到这一点,您可能需要另一个libcurl构建。
  • 5: 无法解析代理,无法解析给定的代理主机。
  • 6: 无法解析主机,未解析给定的远程主机。
  • 7: 无法连接到主机。
  • 8: FTP服务器回复,服务器发送的数据无法解析。
  • 9: FTP访问被拒绝,服务器拒绝登录或拒绝访问您要访问的特定资源或目录,通常,您试图更改到服务器上不存在的目录。
  • 11: 通过回复,curl无法分析发送给PASS请求的回复。
  • 13: FTP奇怪的PASV回复,curl无法解析发送到PASV请求的回复。
  • 14: FTP-227格式,curl无法解析服务器发送的227行。
  • 15: FTP无法获取主机,无法解析227行中的主机IP
  • 17: FTP无法设置二进制文件,无法将传输方法更改为二进制。
  • 18: 部分文件,只传输了文件的一部分。
  • 19: FTP无法下载/访问给定文件,RETR(或类似)命令失败。
  • 21: FTP报价错误,quote命令从服务器返回错误。
  • 22: 未检索到HTTP页,找不到请求的url或返回另一个错误,HTTP错误代码为400或更高,此返回代码仅在使用-f, -fail时出现。
  • 23: 写入错误,curl无法将数据写入本地文件系统或类似文件系统。
  • 25: FTP无法保存文件,服务器拒绝了用于FTP上载的STOR操作。
  • 26: 读取错误,各种各样的阅读问题。
  • 27: 内存不足,内存分配请求失败。
  • 28: 操作超时,已根据条件达到指定的超时期限。
  • 30: FTP端口失败,端口命令失败,并非所有FTP服务器都支持PORT命令,请尝试使用PASV进行传输。
  • 31: FTP无法使用RESTREST命令失败,此命令用于恢复FTP传输。
  • 33: HTTP范围错误,范围命令不起作用。
  • 34: HTTP post错误,内部post请求生成错误。
  • 35: SSL连接错误,SSL握手失败。
  • 36: FTP错误下载恢复,无法继续先前中止的下载。
  • 37: FILE无法读取文件,无法打开文件,可能是权限问题。
  • 38: LDAP无法绑定,LDAP绑定操作失败。
  • 39: LDAP搜索失败。
  • 41: 未找到函数,找不到所需的LDAP函数。
  • 42: 被回调中止,一个应用程序告诉curl中止操作。
  • 43: 内部错误,使用错误的参数调用了函数。
  • 45: 接口错误,无法使用指定的传出接口。
  • 47: 重定向过多,跟随重定向时,curl达到最大数量。
  • 48: 为libcurl指定了未知选项,这表示您向curl传递了一个奇怪的选项,该选项被传递给libcurl并被拒绝,仔细阅读手册。
  • 49: telnet选项格式错误。
  • 51: 对等方的SSL证书或SSH MD5指纹不正常。
  • 52: 服务器没有回复任何内容,这被认为是一个错误。
  • 53: 找不到SSL加密引擎。
  • 54: 无法将SSL加密引擎设置为默认值。
  • 55: 发送网络数据失败。
  • 56: 接收网络数据失败。
  • 58: 本地证书有问题。
  • 59: 无法使用指定的SSL密码。
  • 60: 对等证书不能用已知的CA证书进行身份验证。
  • 61: 无法识别的传输编码。
  • 62: LDAP URL无效。
  • 63: 超过最大文件大小。
  • 64: 请求的FTP SSL级别失败。
  • 65: 发送数据需要倒带失败。
  • 66: 无法初始化SSL引擎。
  • 67: 用户名、密码或类似内容未被接受,curl无法登录。
  • 68: 在TFTP服务器上找不到文件。
  • 69: TFTP服务器上的权限问题。
  • 70: TFTP服务器上的磁盘空间不足。
  • 71: TFTP操作非法。
  • 72: 未知的TFTP传输ID
  • 73: 文件已存在TFTP
  • 74: 没有这样的用户TFTP
  • 75: 字符转换失败。
  • 76: 需要字符转换函数。
  • 77: 读取SSL CA证书(路径)时出现问题,可能是访问权限问题。
  • 78: URL中引用的资源不存在。
  • 79: SSH会话期间发生未指定的错误。
  • 80: 无法关闭SSL连接。
  • 82: 无法加载CRL文件,缺少或格式错误,在7.19.0中添加。
  • 83: 发卡机构检查失败,在7.19.0中添加。
  • 84: FTP PRET命令失败。
  • 85: RTSP:CSeq编号不匹配。
  • 86: RTSP会话标识符不匹配。
  • 87: 无法解析FTP文件列表。
  • 88: FTP区块回调报告错误。
  • 89: 没有可用的连接,会话将排队。
  • XX: 更多的错误代码将出现在这里,在未来的版本,现有的是永远不会改变的。

示例

对网站发起一个HTTP请求。

1
curl www.baidu.com

使curl显示进度表,以指示传输速率、传输的数据量、剩余时间等。

1
curl -# -o ftp://ftp.example.com/file.zip

指定请求的网络接口。

1
curl --interface ppp0 192.168.113.131

将文件下载到本地并命名为1.zip

1
curl -o 1.zip ftp://ftp.example.com/file.zip

curl使用地址重定向。

1
curl -L http://www.google.com

此选项限制数据传输速率的上限,并将其保持在以字节为单位的给定值附近。

1
curl --limit-rate 1000K -O ftp://speedtest.tele2.net/1MB.zip

curl还提供了从用户认证的FTP服务器下载文件的选项。

1
curl -u username:password -O ftp://test.rebex.net/readme.txt

显示详细信息,例如连接的ip地址、请求头与响应头等。

1
curl -v www.baidu.com

设置请求头信息,此处由于响应信息过多将其存储在baidu.html

1
2
3
4
5
curl -v \
-H "Accept-Language: zh-cn" \
-H "Host: www.baidu.com" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" \
-o baidu.html https://www.baidu.com

csplit命令

csplit命令将用PATTERN分隔的FILE文件输出到文件xx00xx01...,并将每个文件的字节数输出到标准输出。

语法

1
csplit [OPTION]... FILE PATTERN...

参数

  • -b, --suffix-format=FORMAT: 使用sprintf FORMAT格式而不是%02d
  • -f, --prefix=PREFIX: 使用PREFIX代替xx
  • -k, --keep-files: 出错时不要删除输出文件。
  • -m, --suppress-matched: 取消匹配PATTERN的行。
  • -n, --digits=DIGITS: 使用指定的数字位数,而不是2
  • -s, --quiet, --silent: 不要打印输出文件大小的计数。
  • -z, --elide-empty-files: 删除空输出文件。
  • --help: 输出帮助信息。
  • --version: 输出版本信息。

模式

如果文件被指定为破折号-csplit将读取标准输入,每种模式可能是:

  • INTEGER: 复制到指定行号,但不包括指定行号。
  • /REGEXP/[OFFSET]: 复制到但不包括匹配行。
  • %REGEXP%[OFFSET]: 跳至但不包括匹配行。
  • {INTEGER}: 重复上一个模式指定的次数。
  • {*}: 尽可能多次重复前面的模式。

示例

list.txt文件内容如下:

1
2
3
4
5
1. Apples
2. Bananas
3. Oranges
4. Pineapples
5. Guava

使用csplit命令将此文件分为两部分,第二部分从第三行开始。

1
2
3
4
5
6
7
8
9
10
11
12
csplit list.txt 3
# 21
# 34

cat xx00
# 1. Apples
# 2. Bananas

cat xx01
# 3. Oranges
# 4. Pineapples
# 5. Guava

使用csplit命令将此文件分为三部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
csplit list.txt 2 3
# 21
# 34

cat xx00
# 1. Apples

cat xx01
# 2. Bananas

cat xx02
# 3. Oranges
# 4. Pineapples
# 5. Guava

使用自定义的分割前缀aa代替xx分割前缀。

1
2
3
4
5
6
csplit list.txt -f aa 3
# 21
# 34

ls
# aa00 aa01 list.txt

使用三位数字代替默认的两位数字。

1
2
3
4
5
6
csplit list.txt -n 3 3
# 21
# 34

ls
# list.txt xx000 xx001

使用模式定义分割规则,重复上一个模式指定的次数。

1
2
3
4
5
6
7
csplit list.txt 2 {1}
# 10
# 22
# 23

ls xx*
# xx00 xx01 xx02

cp命令

cp命令主要用于复制文件或目录。

语法

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

参数

  • -a, --archive: 与-dR --preserve = ALL相同,执行复制时,尝试保留尽可能多的原始文件结构,属性和关联的元数据。
  • --attributes-only: 不复制文件数据,仅创建具有相同属性的文件,如果目标文件已经存在,不更改其内容,并且可以使用--preserve选项精确控制要复制的属性。
  • --backup[=CONTROL]: 对每个现有目标文件进行备份,否则将被覆盖或删除,该控制参数CONTROL指定了版本控制的方法来使用:none, off,不进行备份;numbered, t,进行编号备份;existing, nil,简单的说明编号是否存在编号备份;simple, never, 始终进行简单的备份。有一种特殊情况,当sourcedest是相同的常规文件时,cp --force --backup将对源进行备份。
  • -b: 类似于--backup,但不接受控制参数,始终使用默认的控制方法。
  • --copy-contents: 递归操作时,复制特殊文件的内容,例如FIFO/dev中的设备,通常适用于专业用途。
  • -d: 复制符号链接本身而不是它们引用的文件,并保留副本中源文件之间的硬链接,与--no-dereference --preserve = links相同。
  • -f, --force: 如果无法打开现有的目标文件,将其删除,然后重试。如果使用n / --no-clobber选项,则此选项无效,但是其独立于-i / --interactive来应用,这两个选项都不能消除另一个的影响。
  • -i, --interactive: 覆盖前提示,覆盖先前的-n选项。
  • -H: 遵循命令行上指定的符号链接,但保留发现的链接。如果命令行上的参数之一是符号链接,请复制引用的文件,而不是链接本身。但是如果在递归遍历过程中发现了符号链接,它将被复制为符号链接,而不是常规文件。
  • -l, --link: 创建指向文件的硬链接,而不是复制它们。
  • -L, --dereference: 始终遵循源文件中的符号链接,如果source是符号链接,请复制链接到的文件,而不是符号链接本身,指定此选项后,cp无法在目标副本中创建符号链接。
  • -n, --no-clobber: 不要覆盖现有文件。如果先前指定了-i / --interactive,则此选项将覆盖它,不能使用-b / --backup来指定此选项,因为仅在文件将被覆盖时才创建备份。
  • -P, --no-dereference: 不遵循源代码中的符号链接,将符号链接复制为符号链接,但是仍然可以遵循目标中遇到的现有符号链接。
  • -p: 与--preserve=mode,ownership,timestamps相同。
  • --preserve[=ATTR_LIST]: 保留指定的属性,以逗号分隔。属性是:mode,保留文件模式位(由chmod设置)和任何ACLownership,保留所有者和组(按chown设置),保留这些属性的能力与使用chown相同;timestamps,如果可能的话,保留最后一次文件访问和修改的时间(atimemtime,由touch设置);links,在目标文件中保留源文件之间的所有链接,使用-L-H时,此选项可能会将符号链接复制为硬链接;context,保留源文件的SELinux安全上下文,否则将由于详细的诊断而失败;xattr,保留源文件的扩展属性,否则将因详细诊断而失败;all,保留以上所有内容,与单独指定上述所有属性相同,不同之处在于无法复制contextxattr不会给出失败的退出状态。如果未指定,则attr_list的默认值为modeownershiptimestamps
  • -c: 已弃用,与--preserve=context相同。
  • --no-preserve=ATTR_LIST: 不要保留指定的属性。
  • --parents: 在目录下使用完整的源文件名,即在复制到目标目录时,根据source中指定的路径名,在目标中创建丢失的父目录。
  • -R, -r, --recursive: 递归复制目录。
  • --reflink[=WHEN]: 如果目标文件系统支持,请执行优化的CoW(写时复制)克隆,生成的副本将在磁盘上与原始文件共享相同的字节,直到修改副本为止,请注意这意味着如果源字节已损坏,则目标将共享损坏的数据。
  • --remove-destination: 尝试打开每个目标文件之前,先删除它,与--force选项相反,该选项仅在尝试打开失败后才删除目标文件。
  • --sparse=WHEN: 控制稀疏文件的创建。稀疏文件包含空洞,其中空洞是零字节序列,不占用物理磁盘空间,读取文件时,孔将读取为零。由于许多文件包含长的零序列,因此可以节省磁盘空间,默认情况下,cp检测稀疏文件并创建稀疏目标文件。在当参数定义了cp当检测到源文件是稀疏的行为:auto,如果源稀疏,尝试使目标稀疏,如果目标存在并且是非常规文件,请不要尝试使其稀疏,这是默认值;always,对于源中每个零字节的足够长的序列,即使输入文件不是稀疏的,也要尝试在目标中打稀疏,如果源文件系统不支持稀疏文件,这将可以在目标文件系统上适当地创建一个稀疏文件;never,不使输出文件稀疏,某些特殊文件(例如交换文件)绝对不能稀疏。
  • --strip-trailing-slashes: 删除每个源参数中的所有尾部斜杠。
  • -s, --symbolic-link: 进行符号链接,而不是复制文件本身。除非目标文件位于当前目录中,否则所有源文件都必须是以斜杠开头的绝对路径名。
  • -S, --suffix=SUFFIX: 覆盖通常的备份后缀。
  • -t, --target-directory=DIRECTORY: 将所有源参数复制到目录中。
  • -T, --no-target-directory: 将目的地视为普通文件。
  • -u, --update: 仅在源文件比目标文件新或缺少目标文件时复制。
  • -v, --verbose: 详细模式,解释正在做什么。
  • -x, --one-file-system: 仅在执行命令的文件系统上操作,如果cp试图越过边界到另一个文件系统,则这些文件将被跳过。这包括网络驱动器,驻留在具有不同安装点的文件系统上的任何文件。代表安装点本身的目录将被复制,但不会被遍历。如果指定了-v,则将确切显示已跳过的文件。
  • -Z, --context[=CTX]: 设置目标的SELinux安全上下文,文件为默认类型,或CTX(如果指定)。
  • --help: 显示帮助信息。
  • --version: 显示版本信息。

示例

将文件file.txt复制为file2.txt

1
cp file.txt file2.txt

递归复制文件夹,将tmp文件夹内容全部复制。

1
cp -R ./tmp ./tmp2

创建对file.txt的符号链接而不是复制文件,当然使用ln命令是专门为文件创建符号链接的,cp同样是创建符号链接的好方法,注意要在另一个目录中创建符号链接,cp需要在源文件名中指定完整路径名,包括完整目录名,相对路径将不起作用。

1
cp -s file.txt file-link1

comm命令

comm命令用于比较两个已排过序的文件,该命令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3列显示:第1列仅是在第1个文件中出现过的列,第2列是仅在第2个文件中出现过的列,第3列则是在第1与第2个文件里都出现过的列,若给予的文件名称为-,则comm命令会从标准输入设备读取数据。

语法

1
comm [OPTION]... FILE1 FILE2

参数

  • -1: 禁止列1(FILE1唯一的行)。
  • -2: 禁止列2 (FILE2唯一的行)。
  • -3: 禁止列3(出现在两个文件中的行)。
  • --check-order: 检查输入是否正确排序,即使所有输入行都是可配对的。
  • --nocheck-order: 不检查输入是否正确排序。
  • --output-delimiter=STR: 用字符串STR分隔列。
  • -z, --zero-terminated: 指定行分隔符是NUL,不是换行符。
  • --help: 显示帮助消息。
  • --version: 输出版本信息。

示例

recipe.txt文件与shopping-list.txt文件内容,这两个文件不同,但许多行是相同的,并非所有的配方成分都在购物清单上,也不是购物清单上的所有成分都是食谱的一部分。

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
# recipe.txt
All-Purpose Flour
Baking Soda
Bread
Brown Sugar
Chocolate Chips
Eggs
Milk
Salt
Vanilla Extract
White Sugar

# shopping-list.txt
All-Purpose Flour
Bread
Brown Sugar
Chicken Salad
Chocolate Chips
Eggs
Milk
Onions
Pickles
Potato Chips
Soda Pop
Tomatoes
White Sugar

使用comm命令,其将读取这两个文件并给我们三列输出,在这里,每行输出的开头都有012个制表符,将输出分成三列:

  • 第一列zero tabs是只出现在第一个文件中的行。
  • 第二列one tabs是只出现在第二个文件中的行。
  • 第三列two tabs是出现在两个文件中的行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
comm recipe.txt shopping-list.txt
# All-Purpose Flour
#Baking Soda
# Bread
# Brown Sugar
# Chicken Salad
# Chocolate Chips
# Eggs
# Milk
# Onions
# Pickles
# Potato Chips
#Salt
# Soda Pop
# Tomatoes
#Vanilla Extract
# White Sugar

比较recipe.txt文件与shopping-list.txt文件,并禁用第1与第2列的输出。

1
2
3
4
5
6
7
8
comm -12 recipe.txt shopping-list.txt
# All-Purpose Flour
# Bread
# Brown Sugar
# Chocolate Chips
# Eggs
# Milk
# White Sugar

col命令

在很多UNIX说明文件里,都有RLF控制字符,当我们把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效滤除这些控制字符。

语法

1
col [options]

参数

  • -b, --no-backspaces: 过滤掉所有的控制字符,包括RLFHRLF
  • -f, --fine: 允许前半行换行,通常在半行边界上打印的字符会在下一行上打印,滤除RLF字符,但允许将HRLF字符呈现出来。
  • -p, --pass: 传递未知控制序列,通常col将从输入中过滤出除自身识别和解释的以外的任何控制序列。
  • -h, --tabs: 将空格转换为制表符,这是默认设置。
  • -x, --spaces: 将制表符转换为空格。
  • -l, --lines NUM: 在内存中至少缓冲num行,默认情况下缓存128行。
  • -V, --version: 输出版本信息。
  • -H, --help: 输出帮助信息。

示例

col的帮助文档过滤掉反向换行符RLF后保存到col.txt

1
col --help | col > col.txt

col的帮助文档过滤掉控制字符后保存到col.txt

1
col --help | col -b > col.txt

col的帮助文档的制表符转换为空格后保存到col.txt

1
col --help | col -x > col.txt

colrm命令

colrm命令用于编辑源代码文件,脚本文件或常规文本文件中的文本,此命令从文件中删除选定的列,列定义为一行中的单个字符。索引总是从1开始,而不是0。如果同时指定了开始和结束,则它们之间的列包括开始和结束将被删除。如果只需要删除一列,则开始和结束必须相同。colrm也可以从stdin接受输入。如果不加任何参数,则该指令不会过滤任何一行。

语法

1
colrm [start] [stop]

参数

  • start: 指定要删除的列的起始编号。
  • stop: 指定要删除的列的结束编号,省略则删除从start开始的所有列。
  • -V, --version: 输出版本信息。
  • -h, --help: 输出帮助信息。

示例

从标准输入中获取输入,删除startstop之间的所有字符,包括startstop

1
2
3
colrm 3 6
# 123456
# 127

从标准输入中获取输入,删除start之后所有的字符。

1
2
3
colrm 3
# 1234567
# 12

file.txt文件中的内容,并将删除后的内容写入file2.txt中。

1
cat file.txt | colrm 3 6 > file2.txt

cmp命令

cmp命令用来比较两个文件是否有差异,当相互比较的两个文件完全一样时,则该指令不会输出任何信息,若发现有差异,预设会标示出第一个不同之处的字符和列数编号,若不指定任何文件名称或是所给予的文件名为-,则cmp指令会从标准输入设备读取数据。

语法

1
cmp [-clsv][-i <number of characters>][--help][file][file]

参数

  • -c--print-chars: 除了标明差异处的十进制字码之外,一并显示该字符所对应字符。
  • -i <number of characters>--ignore-initial=<number of characters>: 指定跳过的数目。
  • -l--verbose: 标示出所有不一样的地方。
  • -s--quiet--silent: 不显示错误信息。
  • -v--version: 显示版本信息。
  • --help: 在线帮助。

示例

比较file.txtfile2.txt文件的差异,如果文件相同,则不显示消息,如果文件不同,则显示第一个不同的位置。

1
cmp file.txt file2.txt

比较file.txtfile2.txt文件的差异,标出所有不同之处。

1
cmp -l file.txt file2.txt

比较file.txt与自定义输入内容的差异,输入内容后按Ctrl+D输出EOF标识后结束输入。

1
cmp file.txt -

chown命令

chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组,用户可以是用户或者是用户D,用户组可以是组名或组id,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。一般来说,这个指令只有是由系统管理者root所使用,一般使用者没有权限可以改变别人的文件拥有者,也没有权限把自己的文件拥有者改设为别人,只有系统管理者root才有这样的权限。

语法

1
chown [-cfhvR] [--help] [--version] user[:group] file

参数

  • user: 新的文件拥有者的使用者。
  • group: 新的文件拥有者的使用者组。
  • --help: 在线帮助。
  • --version: 显示版本信息。
  • -c--changes: 效果类似-v参数,但仅回报更改的部分。
  • -f--quite--silent: 不显示错误信息。
  • -h--no-dereference: 只对符号连接的文件作修改,而不更改其他任何相关文件。
  • -R--recursive: 递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v--version: 显示指令执行过程。
  • --dereference: 效果和-h参数相同。
  • --reference=<file or folder>: 把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同。

示例

file.txt文件拥有者设置为www,所属群组设置为web

1
chown www:web file.txt

file.txt文件的所属群组设置为web

1
chown :web file.txt

example文件夹下所有文件文件与目录的拥有者设置为www

1
chown -R www example

chmod命令

chmod命令用来变更文件或目录的权限,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可,此外符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。

语法

1
chmod [option] [ugoa...][[+-=][rwxX]...][,...] file

参数

  • u: 表示该文件的拥有者。
  • g: 表示与该文件的拥有者属于同组group的用户。
  • o: 表示其他以外的人。
  • a: 表示这三者皆是。
  • +: 表示增加权限。
  • -: 表示取消权限。
  • =: 表示唯一设定权限。
  • r: 表示可读取。
  • w: 表示可写入。
  • x: 表示可执行。
  • X: 表示可执行当且仅当这个文件是个目录或者已经被设定过为可执行。
  • -c--changes: 效果类似-v参数,但仅回报更改的部分。
  • -f--quiet--silent: 不显示错误信息。
  • -R--recursive: 递归处理,将指令目录下的所有文件及子目录一并处理。
  • -v--verbose: 显示指令执行过程。
  • --reference=<folder/file>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。

权限

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

1
-rw-r--r--

首符号为-代表该文件为普通文件,为d则代表目录,紧接着三个字符rw-代表用户u权限属性,接下来三个字符r--代表用户组g权限属性,最后三个字符r--代表其他人o权限属性。

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

示例

将文件file.txt设为所有人可读取。

1
chmod ugo+r file.txt
1
chmod a+r file.txt

撤销组用户的对于file.txt的写入权限。

1
chmod g-w file.txt

将文件夹下所有目录与文件设为所有人可读取。

1
chmod -R a+r *

将文件file.txt设为拥有者有写权限,其他用户只有读权限。

1
chmod u=rw,go=r file.txt

将文件file.py设为拥有者有执行权限。

1
chmod u+x file.py

将文件file.py设为拥有者拥有所有权限,其他用户无任何权限。

1
chmod 700 file.py
1
chmod u=rwx,go= file.py

chattr命令

chattr命令可改变存放在ext2文件系统上的文件或目录属性。

语法

1
chattr [-vRV] [mode] [files]

参数

  • -R: 递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v <version num>: 设置文件或目录版本。
  • -V: 显示指令执行过程。
  • + <attribute>: 开启文件或目录的该项属性。
  • - <attribute>: 关闭文件或目录的该项属性。
  • = <attribute>: 指定文件或目录的该项属性。

文件属性

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

示例

防止file.txt文件被修改。

1
chattr +i file.txt

同时对file.txt文件增加两种属性。

1
chattr +ac file.txt

指定file.txt文件的属性。

1
chattr =i file.txt

cat命令

cat命令属于文件管理,用于连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,注意,当文件较大时,文本在屏幕上迅速闪过,会出现滚屏现象,此时往往看不清所显示的内容,为了控制滚屏,可以按Ctrl+S键停止滚屏,按Ctrl+Q键可以恢复滚屏,此外可以用more等命令进行读文件并分页显示。

语法

1
cat [-AbeEnstTuv] [--help] [--version] fileName

参数

  • -n--number: 由1开始对所有输出的行数编号。
  • -b--number-nonblank: 和-n相似,只不过对于空白行不编号。
  • -s--squeeze-blank: 当遇到有连续两行以上的空白行,就代换为一行的空白行。
  • -v--show-nonprinting: 使用^M-符号,除了LFDTAB之外。
  • -E--show-ends: 在每行结束处显示$
  • -T--show-tabs: 将TAB字符显示为^I
  • -A--show-all: 等价于-vET
  • -e: 等价于-vE选项。
  • -t: 等价于-vT选项。

示例

使用cat命令创建一个文件,输入文件信息后按Ctrl+D输出EOF标识后结束输入。

1
cat > file.txt

输出file.txt文件中的内容。

1
cat file.txt

同时输出file.txtfile2.txt文件中的内容。

1
cat file.txt file2.txt

file.txt文件的内容加上行号后追加到file2.txt文件中。

1
cat -n file.txt >> file2.txt

清空file2.txt文件,/dev/null称为空设备,是一个特殊的设备文件,其会丢弃一切写入其中的数据,但报告写入操作成功,读取它则会立即得到一个EOF

1
cat /dev/null > file2.txt

file.txtfile2.txt文件内容合并输出到file3.txt

1
cat file.txt file2.txt > file3.txt

awk命令

Awk是一种用于高级文本处理的通用脚本语言,其主要用作报告和分析工具,与大多数其他程序性编程语言不同,Awk是数据驱动的,也就是说需要定义一组针对输入文本要执行的操作,然后其获取输入数据,对其进行转换,然后将结果发送到标准输出。

语法

1
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]

参数

  • -F fs: 将输入字段分隔符设置为正则表达式fs
  • -v var=value: 在执行awk程序之前,将值赋值给变量var
  • 'prog': awk程序。
  • -f progfile: 指定文件progfile,其中包含要执行的awk程序。
  • file ...: 由指定的awk程序处理的文件。

示例

示例文件example.txt文件内容如下:

1
2
3
4
5
Bucks Milwaukee    60 22 0.732 
Raptors Toronto 55 24 0.707
76ers Philadelphia 51 31 0.622
Celtics Boston 33 33 0.598
Pacers Indiana 30 34 0.585

输出example.txt的第3个字段。

1
2
3
4
5
6
awk '{ print $3 }' example.txt
# 60
# 55
# 51
# 33
# 30

使用正则表达式匹配出以R开头的组。

1
2
awk '/^R/ { print $1,$2,$3,$4 }' example.txt
# Raptors Toronto 55 24

使用BEGIN以及END输出在处理记录之前与之后执行的操作,处理过程为输出第二个字段包含Tor的组。

1
2
3
4
awk 'BEGIN { print "Start Processing" }; $2 ~ /Tor/ {print $1,$2,$3,$4 }; END { print "End Processing" }' example.txt
# Start Processing
# Raptors Toronto 55 24
# End Processing

aspell命令

aspell命令是一个交互式拼写检查器,其会扫描指定的文件或任何标准输入的文件,检查拼写错误,并允许交互式地纠正单词。

语法

1
aspell [options] command

参数

  • usage, -?: 显示常用拼写检查命令和选项的简短摘要。
  • help: 输出帮助信息。
  • version, -v: 输出版本信息。
  • check file, -c file: 拼写检查单个文件。
  • list: 产生标准输入中拼写错误的单词的列表。
  • [dump] config: 将所有当前配置选项转储到标准输出。
  • config key: 将键的当前值发送到标准输出。
  • soundslike: 输出输入的每个单词的等效声音。
  • munch: 从单词输入列表中生成可能的词根和词缀。
  • expand [1-4]: 扩展输入的每个词缀压缩词的词缀标志。
  • clean [strict]: 清除输入单词列表,以便每一行都是有效单词。
  • munch-list [simple] [single|multi] [keep]: 通过词缀压缩减小单词列表的大小。
  • conv from to [norm-form]: 从一种编码转换为另一种编码。
  • norm (norm-map|from norm-map to) [norm-form]: 执行Unicode规范化。
  • [dump] dicts|filters|modes: 列出可用的字典,过滤器或模式。
  • dump|create|merge master|personal|repl wordlist: 转储,创建或合并主,个人或替换单词列表。
  • -mode=mode: 检查文件时使用的模式,可用的模式有noneurlemailsgmltextexinfonroff和系统上可用的任何其他模式。
  • -dont-backup: 不要创建备份文件,通常如果有任何更正,则aspell程序会将.bak附加到现有文件名后,然后创建一个新的带有更正的文件,该文件是在拼写检查期间进行的。
  • --backup, -b, -x: aspell程序通过复制并在文件名后附加.bak来创建备份文件,仅当命令是检查文件并且仅在进行任何拼写修改时才创建备份文件时,这才适用。
  • --sug-mode=mode: 建议模式=ultra|fast|normal|bad-spellers
  • -encoding=name: 预期将对文档进行编码,默认值取决于当前的语言环境。
  • --master=name, -d name: 要使用的词典的基本名称,如果指定了此选项,则aspell将使用此词典或退出。
  • --keymapping=aspell, --keymapping=ispell: 要使用的键映射,默认设置为aspellispell使用与Ispell程序相同的映射。
  • --lang=string, -l string: 要使用的语言,它遵循大多数系统上LANG环境变量的相同格式,由两个字母的ISO639语言代码和短划线或下划线后的可选两个字母的ISO3166国家代码组成,默认值基于LC\u MESSAGES区域设置的值。
  • --dict-dir=directory: 主词典单词列表的位置。
  • --size=string: 字典单词列表的首选大小,它由两个字符的数字代码组成,用于描述列表的大小,典型值为:10=tiny20=really small30=small40=somewhat small50=med60=kinda large70=large80=huge90=enormous
  • --variety=string: 任何额外的信息,以区分这种类型的字典与其他可能具有相同的数量和大小的字典。
  • --jargon=string: 请使用多样性选项,因为它取代术语作为一个更好的选择,这些术语将来会被删除。
  • --word-list-path=list of directories: 单词列表信息文件的搜索路径。
  • --personal=file, -p file: 要使用的个人单词列表的文件名。
  • --repl=file: 替换列表文件名。
  • --extra-dicts=list: 使用额外的字典。
  • --ignore=integer, -W integer: 忽略长度大于或等于整数字符的单词。
  • --ignore-case, --dont-ignore-case: 检查单词时忽略大小写。
  • --ignore-repl, --dont-ignore-repl: 忽略存储替换对的命令。
  • --save-repl, --dont-save-repl: 在全部保存中保存替换单词列表。
  • --conf=filename: 主配置文件,此文件覆盖aspell的全局默认值。
  • --conf-dir=directory: 主配置文件的位置。
  • --data-dir=directory: 语言数据文件的位置。
  • --keyboard=keyboard: 使用此键盘布局建议可能的单词,如果用户不小心按了所需正确键旁边的键,就会发生这些拼写错误。
  • --local-data-dir=directory: 语言数据文件的替代位置,在数据目录之前搜索此目录。
  • --home-dir=directory: 个人单词表文件的目录位置。
  • --per-conf=filename: 个人配置文件,此文件覆盖全局配置文件中的选项。
  • --byte-offsets, --dont-byte-offsets: 使用字节偏移量而不是字符偏移量。
  • --guess, --dont-guess, -m, -P: 在管道模式下,创建不在字典中的缺少的词根/词缀组合。
  • --reverse, --dont-reverse: 在管道模式下,反转建议列表的顺序。
  • --suggest, --dont-suggest: 建议在管道模式下进行可能的替换,如果为假,则aspell将报告拼写错误,并且不尝试任何建议或可能的更正。
  • --time, --dont-time: 给加载时间计时,并建议在管道模式下的时间。

示例

example.txt文件内容如下:

1
The quick brown fox jumped over the extraordinarily lazy dog.

检查文件example.txt是否存在拼写错误,如果有拼写错误则出现选择式交互选项,如果没有拼写错误则不会出现交互式选项。

1
aspell -c sample.txt

使用aspell大量检查单词。运行时将等待用户输入,添加任意数量的单词,完成后按Ctrl + D完成输入,然后即可看到aspell将在输入的下方显示拼写错误的单词。

1
aspell list