Difference between revisions of "Core utilities (简体中文)"

From ArchWiki
Jump to: navigation, search
m (Fixed a translation error in the "cat" chapter.)
(Update translation.)
Line 9: Line 9:
 
[[ru:Core utilities]]
 
[[ru:Core utilities]]
 
[[zh-hant:Core utilities]]
 
[[zh-hant:Core utilities]]
{{TranslationStatus (简体中文)|Core_Utilities|2018-04-15|516773}}
+
{{TranslationStatus (简体中文)|Core_Utilities|2018-06-30|526249}}
 
{{Related articles start (简体中文)}}
 
{{Related articles start (简体中文)}}
 
{{Related|Bash (简体中文)}}
 
{{Related|Bash (简体中文)}}
Line 135: Line 135:
 
|
 
|
 
|}
 
|}
 +
 +
== awk ==
 +
 +
[[Wikipedia:AWK|AWK]] 是一种模式扫描和处理语言,存在多个实现:
 +
 +
* {{App|gawk|GNU 版本的 awk, 参考 {{man|1|gawk}}.|https://www.gnu.org/software/gawk/|{{Pkg|gawk}} (已经包含在{{Grp|base}}中)}}
 +
* {{App|nawk|真正的 AWK 实现,参考 {{man|1|nawk}}.|https://www.cs.princeton.edu/~bwk/btl.mirror/|{{Pkg|nawk}}}}
 +
* {{App|mawk|非常快的 AWK 实现.|http://invisible-island.net/mawk/|{{AUR|mawk}}}}
 +
* [[BusyBox]] 也包含了一个 AWK 实现。
  
 
== cat ==
 
== cat ==
Line 177: Line 186:
  
 
更多信息参考 {{man|1|dd}} 或 [https://www.gnu.org/software/coreutils/dd 完整文档]。
 
更多信息参考 {{man|1|dd}} 或 [https://www.gnu.org/software/coreutils/dd 完整文档]。
 +
 +
{{警告|使用 ''dd'' 时请务必非常小心,这类命令会损坏数据,而且不可恢复。}}
  
 
== find ==
 
== find ==
Line 195: Line 206:
 
* 若要 grep 版本控制系统(VCS)的源代码,请使用专门的工具 {{Pkg|ripgrep}}、{{Pkg|the_silver_searcher}} 和 {{Pkg|ack}}。
 
* 若要 grep 版本控制系统(VCS)的源代码,请使用专门的工具 {{Pkg|ripgrep}}、{{Pkg|the_silver_searcher}} 和 {{Pkg|ack}}。
 
* 要在输出结果中显示行数,加上 {{ic|-n}} 选项。  
 
* 要在输出结果中显示行数,加上 {{ic|-n}} 选项。  
 +
* ''grep'' 可以在二进制文件中查找十六进制数值,例如要查找文件中的 {{ic|A1 F2}}: {{bc|1=$ LANG=C grep --text --perl-regexp "\xA1\xF2" ''/path/to/file''}}
  
 
{{注意|一些命令把错误输出到 {{man|3|stderr}},grep 就无法处理。这时,用 {{ic|''command'' 2>&1 {{!}} grep ''args''}} 或 (对于 Bash 4) {{ic|''command'' {{!}}& grep ''args''}} 将 ''stderr'' 重定向到 ''stdout''。参阅 [http://www.tldp.org/LDP/abs/html/io-redirection.html I/O 重定向]。}}
 
{{注意|一些命令把错误输出到 {{man|3|stderr}},grep 就无法处理。这时,用 {{ic|''command'' 2>&1 {{!}} grep ''args''}} 或 (对于 Bash 4) {{ic|''command'' {{!}}& grep ''args''}} 将 ''stderr'' 重定向到 ''stdout''。参阅 [http://www.tldp.org/LDP/abs/html/io-redirection.html I/O 重定向]。}}
Line 276: Line 288:
  
 
参阅 [[List of applications#Terminal pagers]] 查找更多替代方案。
 
参阅 [[List of applications#Terminal pagers]] 查找更多替代方案。
 
== locate ==
 
 
[[安装]] 软件包 {{Pkg|mlocate}}。包里包括了一个 {{ic|updatedb.timer}} 单元,用于每天更新数据库。这个 systemd 定时器在安装后就会 enable,如果不想重启系统,请手动 [[start]]。以 root 手动运行 ''updatedb'' 也可以更新数据库。默认会忽略 {{ic|/media}} 和 {{ic|/mnt}} 等路径,所以 ''locate'' 不会查找外置设备里的文件。详情请参考 {{man|8|updatedb}}。
 
 
''locate'' 命令是一个快速查找文件系统的常用 Unix 工具。因为是从数据库查找而不是直接访问文件系统,所以速度比 [[wikipedia:Find|find]] 快很多。而缺点是在数据库更新后创建的新文件不会被搜索到。
 
 
使用 ''locate'' 前需建立数据库,请先以 root 权限执行 {{ic|updatedb}}。
 
 
详情参考 [http://jvns.ca/blog/2015/03/05/how-the-locate-command-works-and-lets-rewrite-it-in-one-minute/ How locate works and rewrite it in one minute]。
 
  
 
=== 用 Vim 代替 less 来分页 ===
 
=== 用 Vim 代替 less 来分页 ===
Line 299: Line 301:
  
 
这样,所有使用 {{ic|PAGER}} 环境变量的程序, 如 [[git]], 将使用 ''vim'' 作为分页程序。
 
这样,所有使用 {{ic|PAGER}} 环境变量的程序, 如 [[git]], 将使用 ''vim'' 作为分页程序。
 +
 +
== locate ==
 +
 +
[[安装]] 软件包 {{Pkg|mlocate}}。包里包括了一个 {{ic|updatedb.timer}} 单元,用于每天更新数据库。这个 systemd 定时器在安装后就会 enable,如果不想重启系统,请手动 [[start]]。以 root 手动运行 ''updatedb'' 也可以更新数据库。默认会忽略 {{ic|/media}} 和 {{ic|/mnt}} 等路径,所以 ''locate'' 不会查找外置设备里的文件。详情请参考 {{man|8|updatedb}}。
 +
 +
''locate'' 命令是一个快速查找文件系统的常用 Unix 工具。因为是从数据库查找而不是直接访问文件系统,所以速度比 [[wikipedia:Find|find]] 快很多。而缺点是在数据库更新后创建的新文件不会被搜索到。
 +
 +
使用 ''locate'' 前需建立数据库,请先以 root 权限执行 {{ic|updatedb}}。
 +
 +
详情参考 [http://jvns.ca/blog/2015/03/05/how-the-locate-command-works-and-lets-rewrite-it-in-one-minute/ How locate works and rewrite it in one minute]。
  
 
== ls ==
 
== ls ==

Revision as of 23:42, 29 June 2018

翻译状态: 本文是英文页面 Core_Utilities翻译,最后翻译时间:2018-06-30,点击这里可以查看翻译后英文页面的改动。

本文涉及 GNU/Linux 系统的所谓的 "核心" 工具,比如 less, ls, 和 grep,包括但不限于以上集成于 GNU coreutils 中的工具。下文提供了关于这些实用工具颇为丰富的技巧和有帮助的其他信息。

基本命令

下面表格列出了每个 Linux 用户都应该熟悉的命令,黑体命令是 shell 的一部分,其它的是 shell 调用的程序。命令的细节请阅读接下来的几节和相关文章

命令 描述 手册页名称 示例
man 显示命令的手册页 man(7) man ed
cd 变更目录 cd(1p) cd /etc/pacman.d
mkdir 创建目录 mkdir(1) mkdir ~/newfolder
rmdir 删除空目录 rmdir(1) rmdir ~/emptyfolder
rm 删除文件 rm(1) rm ~/file.txt
rm -r 删除目录和内容 rm -r ~/.cache
ls 显示文件 ls(1) ls *.mkv
ls -a 显示隐藏文件 ls -a /home/archie
ls -al 显示隐藏文件和文件属性
mv 移动文件 mv(1) mv ~/compressed.zip ~/archive/compressed2.zip
cp 复制文件 cp(1) cp ~/.bashrc ~/.bashrc.bak
chmod +x 设置文件为可执行文件 chmod(1) chmod +x ~/.local/bin/myscript.sh
cat 显示文件内容 cat(1) cat /etc/hostname
strings 显示文件中可打印的内容 strings(1) strings /usr/bin/free
find 查找文件 find(1) find ~ -name myfile
mount 挂载分区 mount(8) mount /dev/sdc1 /media/usb
df -h 显示分区上的剩余空间 df(1)
ps -A 显示所有正在运行的进程 ps(1)
killall 杀死所有运行中的进程 killall(1)
ss -at 显示开放的 TCP 连接列表 ss(8)

awk

AWK 是一种模式扫描和处理语言,存在多个实现:

  • gawk — GNU 版本的 awk, 参考 gawk(1).
https://www.gnu.org/software/gawk/ || gawk (已经包含在base中)
  • nawk — 真正的 AWK 实现,参考 nawk(1).
https://www.cs.princeton.edu/~bwk/btl.mirror/ || nawk
  • mawk — 非常快的 AWK 实现.
http://invisible-island.net/mawk/ || mawkAUR
  • BusyBox 也包含了一个 AWK 实现。

cat

cat 是一个将文件内容发送到标准输出的标准 Unix 工具。

  • cat 并不内置于 shell ,不过若追求高性能,你会发现在很多情况下改用重定向就很方便得许多,例如编写脚本。事实上,$ < file 的效果就如同 $ cat file 一样。
  • 按照以下结构可直接在某文件添加多行文字:
$ cat << EOF >> path/file
first line
...
last line
EOF

或者使用 printf:

$ printf '%s\n' 'first line' ... 'last line'
  • 如果您希望能以倒读顺序显示文件内容,有个位于 coreutils 包中的工具叫 tac (cat 倒着写)。

chmod

参阅 File permissions and attributes#Changing permissions

chown

参阅 File permissions and attributes#Changing ownership

dd

dd 是在 unix 和 类 unix 系统中主要用于转换和拷贝文件的命令。

cp 类似,默认情况下 dd 以块为单位拷贝文件,具有较低级别的 I/O流 控制功能。

提示: 默认情况下在任务完成前 dd 都没有输出,要监控操作的进度,可以添加 status=progress 选项。

更多信息参考 dd(1)完整文档

警告: 使用 dd 时请务必非常小心,这类命令会损坏数据,而且不可恢复。

find

findfindutils 软件包的一部分, 它属于 base 软件包组。

提示: fdfind 的一个更加简单、快速、友好的替代方案,它有着更合理的默认值(比如忽略隐藏文件、文件夹和 .gitignore 等文件,可用 fd PATTERN 代替 find -iname '*PATTERN*')。它具有彩色输出(类似 ls),unicode 支持,正则表达式等等。

你可能希望 find 命令将一个文件名称作为参数,并在文件系统中搜索与该名称匹配的文件。下面的 #locate 程序可以专门做这件事。

相反,find 需要一组目录,并将它们下面的每个文件与一组表达式进行匹配。这种设计为实现一些“能干的单行小程序”提供了强大的支持,而这是上述“直观”设计无法实现的。参阅 UsingFind 来获取使用说明。

grep

grep (来自 edg/re/pglobal/regular expression/print)是最初给 Unix 写的命令行文字搜索工具,grep 命令在文件或标准输入里搜索符合指定正则表达式模式的行,并把结果打印到标准输出。

  • 记住,grep 能直接处理文件,所以用 grep pattern file 代替 cat file | grep pattern 即可。
  • 若要 grep 版本控制系统(VCS)的源代码,请使用专门的工具 ripgrepthe_silver_searcherack
  • 要在输出结果中显示行数,加上 -n 选项。
  • grep 可以在二进制文件中查找十六进制数值,例如要查找文件中的 A1 F2:
    $ LANG=C grep --text --perl-regexp "\xA1\xF2" /path/to/file
注意: 一些命令把错误输出到 stderr(3),grep 就无法处理。这时,用 command 2>&1 | grep args 或 (对于 Bash 4) command |& grep argsstderr 重定向到 stdout。参阅 I/O 重定向

参阅 Color output in console#grep 来启用彩色输出支持。

iconv

iconv 将转换一个文本的字符编码。

下列命令将文件 foo 从 ISO-8859-15 转换至 UTF-8,然后保存到 foo.utf

$ iconv -f ISO-8859-15 -t UTF-8 foo > foo.utf

查阅 iconv(1) 获取更多细节。

在原文件上转换

提示: 如果你不想改变文件的修改时间,可以用 recode 代替 iconv。

sed 不同,iconv 没有提供直接转换文件的选项,但是 moreutils 包里面的 sponge 可以帮忙:

$ iconv -f WINDOWS-1251 -t UTF-8 foobar.txt | sponge foobar.txt

更多细节请参阅 sponge(1)

ip

ip 显示关于网络设备,IP 地址,路由表和其他 Linux IP 软件栈的对象信息。通过附加各种命令,你可以操纵或配置大多数对象。

注意: ip 命令在 iproute2 包中提供,这个包已经包含在 base 组。
对象 作用 手册页名称
ip addr 协议地址管理 ip-address(8)
ip addrlabel 协议地址标签管理 ip-addrlabel(8)
ip l2tp tunnel Ethernet over IP (L2TPv3) ip-l2tp(8)
ip link 网络设备配置 ip-link(8)
ip maddr 多播地址管理 ip-maddress(8)
ip monitor 监测 netlink 信息 ip-monitor(8)
ip mroute 多播路由缓存管理 ip-mroute(8)
ip mrule 多播路由策略数据库的规则
ip neigh 邻居/ARP 表管理 ip-neighbour(8)
ip netns process network namespace management ip-netns(8)
ip ntable 邻居表配置 ip-ntable(8)
ip route 路由表管理 ip-route(8)
ip rule 路由策略数据库管理 ip-rule(8)
ip tcp_metrics 管理 TCP Metrics ip-tcp_metrics(8)
ip tunnel 隧道配置 ip-tunnel(8)
ip tuntap 管理 TUN/TAP 设备
ip xfrm 管理 IPsec 策略 ip-xfrm(8)

help 帮助命令可用于所有对象。例如,输入 ip addr help 将显示地址的命令语法。高级用法参见 iproute2 documentation

Network configuration 显示 ip 命令的多种常见任务中的使用方式。

注意: 你也许很熟悉 ifconfig 命令,它用于旧版linux的接口配置。在 Arch Linux 中现已不赞成使用;应当用 ip 替代之。

less

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: less 是一个复杂的家伙,这一章应该介绍一些基本的 less 命令。 (Discuss in Talk:Core utilities (简体中文)#)

less 是一个对文本文件内容进行分页显示的终端程序,它和其他的分页显示程序如 morepg 相似,但 less 提供了更高级的界面和更多的 功能

参阅 List of applications#Terminal pagers 查找更多替代方案。

用 Vim 代替 less 来分页

Vim 内置了脚本,可直接查看文本文件、压缩包或目录的内容。在你的 shell 配置文件添加以下内容:

~/.bashrc
alias less='/usr/share/vim/vim80/macros/less.sh'

除了 less.sh 宏外还有另外一种用法,依赖于 PAGER 环境变量。安装 vimpager 并添加以下内容至shell配置文件:

~/.bashrc
export PAGER='vimpager'
alias less=$PAGER

这样,所有使用 PAGER 环境变量的程序, 如 git, 将使用 vim 作为分页程序。

locate

安装 软件包 mlocate。包里包括了一个 updatedb.timer 单元,用于每天更新数据库。这个 systemd 定时器在安装后就会 enable,如果不想重启系统,请手动 start。以 root 手动运行 updatedb 也可以更新数据库。默认会忽略 /media/mnt 等路径,所以 locate 不会查找外置设备里的文件。详情请参考 updatedb(8)

locate 命令是一个快速查找文件系统的常用 Unix 工具。因为是从数据库查找而不是直接访问文件系统,所以速度比 find 快很多。而缺点是在数据库更新后创建的新文件不会被搜索到。

使用 locate 前需建立数据库,请先以 root 权限执行 updatedb

详情参考 How locate works and rewrite it in one minute

ls

ls 是一个Unix和类Unix系统中列出目录里的文件的一个命令。

请参考 info ls在线文档

exa 相较于 lstree 是一个更加现代的、人性化的选择。它有更多的特性,例如将 Git 修改和文件名一同显示,在 --long 模式中对每列进行不同的着色,或者在 tree 视图中显示 --long 模式元数据。 exa

“长格式”输出

-l 选项显示一些元数据,例如:

$ ls -l /path/to/directory
total 128
drwxr-xr-x 2 archie users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 archie users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 archie users  4096 Jul  5 13:45 Downloads
-rw-rw-r-- 1 archie users  5120 Jun 27 08:28 customers.ods
-rw-r--r-- 1 archie users  3339 Jun 27 08:28 todo
-rwxr-xr-x 1 archie users  2048 Jul  6 12:56 myscript.sh

total 值表示目录中文件的总磁盘分配,默认情况下为块的数量。

每个文件和子目录由一行表示,每行划分为 7 个字段,按以下顺序表示:

  • 类型与权限:
    • 首字母表示内部类型,参阅 info ls -n "What information is listed" 来查看所有可能类型的介绍;例如:
      • - 表示一个普通文件;
      • d 表示一个目录,比如一个包括了其他文件和文件夹的文件夹;
      • p 表示一个命名的管道(又名 FIFO);
      • l 表示这是一个软链接;
    • 其他字母表示这个条目的 权限;
  • 这个条目 硬链接 的数量;对文件而言这个数字至少是 1,即当前显示的文件引用本身;对文件夹而言这个数字至少是 2,当前显示的引用、对自己的引用(. 条目)以及这个文件夹中的子文件夹对父文件夹的引用(.. 条目);
  • 用户 名;
  • 名;
  • 大小;
  • 修改时间;
  • 名称。

带空格的文件名被引号引起

默认情况下,包含空格的文件名和目录名会被单引号引起。要改变这一特性,请使用 -N--quoting-style=literal 选项。另外,将 QUOTING_STYLE 环境变量 设置为 literal 也可以。[1]

lsblk

lsblk(8) 命令会显示所有连接到系统的 块设备 和分区状况:

$ lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda
├─sda1 vfat                 C4DA-2C4D                            /boot
├─sda2 swap                 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 [SWAP]
└─sda3 ext4                 56adc99b-a61e-46af-aab7-a6d07e504652 /

设备名开头定义块设备的类型,大部分现代的硬盘、SSD 和 USB 闪存设备都被识别为 SCSI disks (sd)。类型后面跟着给设备编号的小写字母,第一个设备从 a 开始 (sda),第二个设备就是 b (sdb),以此类推。每个设备上的 现有 分区将用数字编号,从 1 开始 (sda1),第二个分区就是 2 (sda2),以此类推。在上面的示例中,只有一个设备可用 (sda),该设备有三个分区 (sda1sda3),每个分区具有不同的 文件系统

其它块设备比如 mmcblk(内存卡)或 nvmeNVMe 设备)。不清楚的设备类型可以在这里搜索到:kernel documentation[dead link 2017-11-11]

mkdir

mkdir (make directory) 可以创建目录。

若需递归地创建一系列目录,就要用到 -p 参数了,否则会出错。已经十分熟悉这原理的高级用户也可直接设为内置参数:

alias mkdir='mkdir -p -v'

-v 参数可以使创建目录过程中的信息更为详细。

不必使用 chmod 更改权限模式, 用 -m 选项可直接定义新建目录的访问权限。

提示: 如果您仅仅只是想建个临时目录,也许用 mktemp: mktemp -d 更好。

mv

mv (move) 可以移动或重命名文件和目录。

为了降低使用这个命令带来的风险,请添加一个 alias:

alias mv='timeout 8 mv -iv'

这个别名可以延迟 mv 到 8 秒后才生效,在覆盖已存在的文件时要求确认,列出正在进行的操作并且在 shell 被配置为忽略空格开头的命令的情况下,不将自身记入 shell 的命令历史记录。

od

od (octal dump) 命令在显示非人类可读格式时非常有用,比如程序的可执行文件,或者未格式化的设备的内容。参阅manual 了解详情。

pv

可以用 pv (pipe viewer) 来监视管道中传递的数据,例如:

# dd if=/source/filestream | pv -monitor_options -s size_of_file | dd of=/destination/filestream

大多数情况下 pv 可直接替代 cat

rm

rm (remove) 用于删除文件或目录。

为了降低使用这个命令带来的风险,请添加一个 alias:

alias rm='timeout 3 rm -Iv --one-file-system'

这个别名可延迟 rm 到 3 秒后才生效,在删除三个以上的文件时要求确认,列出正在进行的操作,限于只在同一个文件系统生效并且在 shell 被配置为忽略空格开头的命令的情况下,不将自身记入 shell 的命令历史记录。若你想在删除多文件时一一确认,用 -I 代替 -i 即可。

Zsh 的使用者可在 timeout 前加上 noglob,避免隐式扩展。

若要移除空目录,使用 rmdir,若内含文件则命令失败。

sed

sed (stream editor) 是一条专门解析或替换文本的命令。

这里有一系列现成的 sed 示范

提示: AWKPerl 语言在这方面更为强大。

seq

seq (sequence) 是一条专门排列数字的命令。Shell 内置了该命令的其他替代方案,可以按照 Wikipedia 的说明进行练习。

ss

ss 是一个检查网络端口的实用程序,并且是 base 组中的 iproute2 包的一部分。它具有与 弃用的 netstat 实用程序类似的功能。

常用用法包括:

显示所有 TCP Sockets,连同 service 名称:

$ ss -at

显示所有 TCP Sockets,连同端口号:

$ ss -atn

显示所有 UDP Sockets:

$ ss -au

更多信息请参考 iproute2 包里的 ss(8)ss.html

tar

作为早期的 Unix 存档格式,.tar 文件(称为“tarballs”)广泛用于类 Unix 操作系统中的打包操作。pacmanAUR 软件包都是压缩的 tarball,Arch 默认使用 GNU 的 tar 程序。

对于 .tar 文件,tar 默认根据扩展名来解压文件:

$ tar xvf file.EXTENSION

强制给定格式:

文件类型 解压命令
file.tar tar xvf file.tar
file.tgz tar xvzf file.tgz
file.tar.gz tar xvzf file.tar.gz
file.tar.bz bzip -cd file.bz | tar xvf -
file.tar.bz2 tar xvjf file.tar.bz2
bzip2 -cd file.bz2 | tar xvf -
file.tar.xz tar xvJf file.tar.xz
xz -cd file.xz | tar xvf -
file.tar.zst tar -I zstd xvf file.tar.zst

这其中有部分 tar 的参数可以认为是历史遗留问题,但在执行某些特定的操作时仍然有用。更多细节请参阅 tar(1)

which

which 显示 shell 命令的完整路径。在下面的例子中 ssh 的完整路径作为一个参数传递给了 journalctl

# journalctl $(which sshd)

wipefs

wipefs 可以列出或擦除指定设备的 文件系统RAID分区表 标志 (magic strings)。它不会擦除文件系统本身,也不会擦除设备中的任何其他数据。

更多信息请参阅 wipefs(8)

例如,擦除 /dev/sdb 设备中的所有标志并为每个标志在 ~/wipefs-sdb-offset.bak 创建一个备份文件:

# wipefs --all --backup /dev/sdb

参阅