蚊章汇 - Sandra Henry-Stocker
type: channel
link: https://linuxcn.bwsl.wang/author/96/
description: Sandra Henry-Stocker
items: 使用 watch 和 tail 命令监视 Linux 上的活动
items: 用 ranger 在 Linux 文件的海洋中导航
items: 从 Linux 命令行进行打印
items: 如何使用 lshw 查看 Linux 设备信息
items: 用 testdisk 恢复 Linux 上已删除的文件
items: 使用 Linux stat 命令创建灵活的文件列表
items: 在 Linux 上调整命令历史
items: 把 Linux 上的文件列表和排序玩出花来
items: 合并和排序 Linux 上的文件
items: 汇总你在 Linux 上的命令使用情况

使用 watch 和 tail 命令监视 Linux 上的活动
type: item
date: 2022-05-07T17:17:45+08:00
description: watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。watch 和 tail 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。也就是说，你可以通过 watch 来显示谁已登录，并随着用户登录和注销不断更新，而不是仅仅提出问题并获得答案（例如询问 who 并获取当前登录用户的列表）。使用 tail，你可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用，并且比定期运行命令所需的工作更少。使用 watch 命令使用 watch 的最简单示例之一是使用命令 watch who。你会看到一个列表，其中显示了谁登录了，以及他们登录的时间和登录位置。请注意，默认设置是每两秒更新一次显示（左上角），日期和时间（右上角）将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。$ watch who 此命令将显示如下所示的登录列表：Every 2.0s: who dragonfly: Thu Feb 27 10:52:00 2020 nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 你可以通过添加 -n 选项（例如 -n 10）来修改更新间的不同秒数，以修改更新间隔，从而获取较少的更新频率。$ watch -n 10 who 上述命令将以新的间隔显示，并且显示的时间更新频率较低，从而使显示时间与所选间隔保持一致。Every 10.0s: who dragonfly: Thu Feb 27 11:05:47 2020 nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 如果你希望仅查看命令的输出，而不是标题（前 2 行），则可以通过添加 -t（无标题）选项来省略这些行。$ watch -t who 然后，你的屏幕将显示如下所示：nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 如果每次运行监视的命令时，输出都是相同的，则只有标题行（如果未省略）会更改。其余显示的信息将保持不变。如果你希望 watch 命令在它正在监视的命令的输出发生更新后立即退出，则可以使用 -g（将其视为“ 离开 go away ”）选项。例如，如果你只是在等待其他人开始登录系统，则可以选择执行此操作。你还可以使用 -d（ 差异 differences ）选项突出显示显示输出中的更改。突出显示只会持续一个间隔（默认为 2 秒），但有助于引起你对更新的注意。下面是一个更复杂的示例，该示例使用 watch 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改，但它会提醒你任何新服务正在启动或关闭。$ watch 'sudo lsof -i -P -n | grep LISTEN' 值得注意的是，正在运行的命令需要用引号扩起来，以确保不会将 watch 命令的输出发送到 grep 命令。使用 watch -h 命令将为你提供命令选项的列表。$ watch -h Usage: watch [options] command Options: -b, --beep beep if command has a non-zero exit -c, --color interpret ANSI color and style sequences -d, --differences[=<permanent>] highlight changes between updates -e, --errexit exit if command has a non-zero exit -g, --chgexit exit when output from command changes -n, --interval <secs> seconds to wait between updates -p, --precise attempt run command in precise intervals -t, --no-title turn off header -x, --exec pass command to exec instead of "sh -c" -h, --help display this help and exit -v, --version output version information and exit 使用 tail -ftail…

用 ranger 在 Linux 文件的海洋中导航
type: item
date: 2021-02-20T20:19:38+08:00
description: ranger 是一个很好的工具，它为你的 Linux 文件提供了一个多级视图，并允许你使用方向键和一些方便的命令进行浏览和更改。ranger 是一款独特且非常方便的文件系统导航器，它允许你在 Linux 文件系统中移动，进出子目录，查看文本文件内容，甚至可以在不离开该工具的情况下对文件进行修改。它运行在终端窗口中，并允许你按下方向键进行导航。它提供了一个多级的文件显示，让你很容易看到你在哪里、在文件系统中移动、并选择特定的文件。要安装 ranger，请使用标准的安装命令（例如，sudo apt install ranger）。要启动它，只需键入 ranger。它有一个很长的、非常详细的手册页面，但开始使用 ranger 非常简单。ranger 的显示方式你需要马上习惯的最重要的一件事就是 ranger 的文件显示方式。一旦你启动了 ranger，你会看到四列数据。第一列是你启动 ranger 的位置的上一级。例如，如果你从主目录开始，ranger 将在第一列中列出所有的主目录。第二列将显示你的主目录（或者你开始的目录）中的目录和文件的第一屏内容。这里的关键是超越你可能有的任何习惯，将每一行显示的细节看作是相关的。第二列中的所有条目与第一列中的单个条目相关，第四列中的内容与第二列中选定的文件或目录相关。与一般的命令行视图不同的是，目录将被列在第一位（按字母数字顺序），文件将被列在第二位（也是按字母数字顺序）。从你的主目录开始，显示的内容可能是这样的：shs@dragonfly /home/shs/backups <== current selection bugfarm backups 0 empty dory bin 59 eel Buttons 15 nemo Desktop 0 shark Documents 0 shs Downloads 1 ^ ^ ^ ^ | | | | homes directories # files listing in selected in each of files in home directory selected directory ranger 显示的最上面一行告诉你在哪里。在这个例子中，当前目录是 /home/shs/backups。我们看到高亮显示的是 empty，因为这个目录中没有文件。如果我们按下方向键选择 bin，我们会看到一个文件列表：shs@dragonfly /home/shs/bin <== current selection bugfarm backups 0 append dory bin 59 calcPower eel Buttons 15 cap nemo Desktop 0 extract shark Documents 0 finddups shs Downloads 1 fix ^ ^ ^ ^ | | | | homes directories # files listing in selected in each of files in home directory selected directory 每一列中高亮显示的条目显示了当前的选择。使用右方向键可移动到更深的目录或查看文件内容。如果你继续按下方向键移动到列表的文件部分，你会注意到第三列将显示文件大小（而不是文件的数量）。“当前选择”行也会显示当前选择的文件名，而最右边的一列则会尽可能地显示文件内容。shs@dragonfly /home/shs/busy_wait.c <== current selection bugfarm BushyRidge.zip 170 K /* dory busy_wait.c 338 B * program that does a busy wait eel camper.jpg 5.55 M * it's used to show ASLR, and that's it nemo check_lockscreen 80 B */ shark chkrootkit-output 438 B #include <stdio.h> ^ ^ ^ ^ | | | | homes files sizes file content 在该显示的底行会显示一些文件和目录的详细信息：-rw-rw-r—- shs shs 338B 2019-01-05 14:44 1.52G, 365G free 67/488 11% 如果你选择了一个目录并按下回车键，你将进入该目录。然后，在你的显示屏中最左边的一列将是你的主目录的内容列表，第二列将是该目录内容的文件列表。然后你可以检查子目录的内容和文件的内容。按左方向键可以向上移动一级。按 q 键退出 ranger。做出改变你可以按 ?…

从 Linux 命令行进行打印
type: item
date: 2021-01-14T07:03:17+08:00
description: 在 Linux 命令行进行打印的内容比单单一个 lp 命令多得多，让我们来看一些可用选项。Linux 命令行打印很容易。你可以使用 lp 命令来请求打印，并使用 lpq 命令来查看队列中有哪些打印作业，但是当你要双面打印或使用纵向模式时，这些会变得有些复杂。你可能还需要做很多其他事情，例如打印多份文档副本或取消打印作业。让我们来看看一些选项，当你从命令行打印时，如何让你的打印输出看起来如你所愿。显示打印机配置要从命令行查看打印机设置，请使用 lpoptions 命令。 输出应如下所示：$ lpoptions copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided 如果将其空格转换为回车符，输出可能会更人性化，请注意列出了多少设置选项。注意：在下面的输出中，一些行被重新链接，以使输出更具可读性。$ lpoptions | tr " " '\n' copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A, Cyan\ Cartridge\ HP\ CC531A, Magenta\ Cartridge\ HP\ CC533A, Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3…

如何使用 lshw 查看 Linux 设备信息
type: item
date: 2020-10-10T16:55:34+08:00
description: Linux 系统上的 lshw 命令提供的系统设备信息比我们大多数人想象的要多得多。虽然 lshw 命令（ 列出硬件 list hardware ，读作 “ls hardware”）远不是每个人最先学会的 50 个 Linux 命令之一，但它可以提供很多系统硬件的有用信息。它以一种相当易于理解的格式提取出可能比你知道的更多的信息。在看到描述、（设备）逻辑名称、大小等以后，你可能会理解到自己能获得多少信息。这篇文章会研究 lshw 给出的信息，但侧重于磁盘及相关硬件。下面是 lshw 的输出示例：$ sudo lshw -C disk *-disk:0 description: SCSI Disk product: Card Reader-1 vendor: JIE LI physical id: 0.0.0 bus info: scsi@4:0.0.0 logical name: /dev/sdc version: 1.00 capabilities: removable configuration: logicalsectorsize=512 sectorsize=512 *-medium physical id: 0 logical name: /dev/sdc 请注意，你需要使用 sudo 运行 lshw 命令以确保能得到所有可用的信息。虽然我们在上面的命令中要求了输出“磁盘（disk）”（上面只包含了原始输出里五个条目中的一个），这里的输出却不是一个硬盘，而是读卡器——磁盘的一种。注意系统将这个设备命名为了 /dev/sdc。系统的主磁盘上也有相似的信息：*-disk description: ATA Disk product: SSD2SC120G1CS175 physical id: 0 bus info: scsi@0:0.0.0 logical name: /dev/sda <==这里 version: 1101 serial: PNY20150000778410606 size: 111GiB (120GB) capabilities: partitioned partitioned:dos configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature= f63b5929 这块硬盘是 /dev/sda。这个系统上的硬盘都显示为 ATA 磁盘，ATA 是一种把控制器与盘体集成在一起的磁盘驱动器实现。要获得“磁盘”类设备的简略列表，可以运行下面这条命令。注意其中有两个设备被列出了两次，所以我们看到的仍然是五个磁盘设备。$ sudo lshw -short -C disk H/W path Device Class Description ============================================================= /0/100/1d/1/1/0.0.0 /dev/sdc disk Card Reader-1 /0/100/1d/1/1/0.0.0/0 /dev/sdc disk /0/100/1d/1/1/0.0.1 /dev/sdd disk 2 /0/100/1d/1/1/0.0.1/0 /dev/sdd disk /0/100/1f.2/0 /dev/sda disk 120GB SSD2SC120G1CS175 /0/100/1f.2/1 /dev/cdrom disk DVD+-RW GSA-H73N /0/100/1f.5/0.0.0 /dev/sdb disk 500GB SAMSUNG HE502HJ 如果你决定要查看系统上的 所有 设备，请坐稳了；你会得到一个包含的东西比你通常认为的“设备”要多得多的列表，下面是一个例子，这是一个“简短（short）”（信息很少）的列表：$ sudo lshw -short [sudo] password for shs: H/W path Device Class Description ============================================================= system Inspiron 530s /0 bus 0RY007 /0/0 memory 128KiB BIOS /0/4 processor Intel(R) Core(TM)2 Duo CPU /0/4/a memory 32KiB L1 cache /0/4/b memory 6MiB L2 cache /0/24 memory 6GiB System Memory /0/24/0 memory 2GiB DI…

用 testdisk 恢复 Linux 上已删除的文件
type: item
date: 2020-10-02T08:39:15+08:00
description: 这篇文章介绍了 testdisk，这是恢复最近删除的文件（以及用其他方式修复分区）的工具之一，非常方便。当你在 Linux 系统上删除一个文件时，它不一定会永远消失，特别是当你最近才刚刚删除了它的时候。除非你用 shred 等工具把它擦掉，否则数据仍然会放在你的磁盘上 —— 而恢复已删除文件的最佳工具之一 testdisk 可以帮助你拯救它。虽然 testdisk 具有广泛的功能，包括恢复丢失或损坏的分区和使不能启动磁盘可以重新启动，但它也经常被用来恢复被误删的文件。在本篇文章中，我们就来看看如何使用 testdisk 恢复已删除的文件，以及该过程中的每一步是怎样的。由于这个过程需要不少的步骤，所以当你做了几次之后，你可能会觉得操作起来会更加得心应手。安装 testdisk可以使用 apt install testdisk 或 yum install testdisk 等命令安装 testdisk。有趣的是，它不仅是一个 Linux 工具，而且还适用于 MacOS、Solaris 和 Windows。文档可在 cgsecurity.org 中找到。恢复文件首先，你必须以 root 身份登录，或者有 sudo 权限才能使用 testdisk。如果你没有 sudo 访问权限，你会在这个过程一开始就被踢出，而如果你选择创建了一个日志文件的话，最终会有这样的消息：TestDisk exited normally. jdoe is not in the sudoers file. This incident will be reported. 当你用 testdisk 恢复被删除的文件时，你最终会将恢复的文件放在你启动该工具的目录下，而这些文件会属于 root。出于这个原因，我喜欢在 /home/recovery 这样的目录下启动。一旦文件被成功地还原和验证，就可以将它们移回它们的所属位置，并将它们的所有权也恢复。在你可以写入的选定目录下开始：$ cd /home/recovery $ testdisk testdisk 提供的第一页信息描述了该工具并显示了一些选项。至少在刚开始，创建个日志文件是个好主意，因为它提供的信息可能会被证明是有用的。下面是如何做的：Use arrow keys to select, then press Enter key: >[ Create ] Create a new log file [ Append ] Append information to log file [ No Log ] Don’t record anything 左边的 > 以及你看到的反转的字体和背景颜色指出了你按下回车键后将使用的选项。在这个例子中，我们选择了创建日志文件。然后会提示你输入密码（除非你最近使用过 sudo）。下一步是选择被删除文件所存储的磁盘分区（如果没有高亮显示的话）。根据需要使用上下箭头移动到它。然后点两次右箭头，当 “Proceed” 高亮显示时按回车键。Select a media (use Arrow keys, then press Enter): Disk /dev/sda - 120 GB / 111 GiB - SSD2SC120G1CS1754D117-551 >Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ Disk /dev/loop0 - 13 MB / 13 MiB (RO) Disk /dev/loop1 - 101 MB / 96 MiB (RO) Disk /dev/loop10 - 148 MB / 141 MiB (RO) Disk /dev/loop11 - 36 MB / 35 MiB (RO) Disk /dev/loop12 - 52 MB / 49 MiB (RO) Disk /dev/loop13 - 78 MB / 75 MiB (RO) Disk /dev/loop14 - 173 MB / 165 MiB (RO) Disk /dev/loop15 - 169 MB / 161 MiB (RO) >[Previous] [ Next ] [Proceed ] [ Quit ] 在这个例子中，被删除的文件在 /dev/sdb 的主目录下。此时，testdisk 应该已经选择了合适的分区类型。Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ Please select the partition table type, press Enter when done. [Intel ] Intel/PC partition >[EFI GPT] EFI GPT …

使用 Linux stat 命令创建灵活的文件列表
type: item
date: 2020-09-22T06:32:11+08:00
description: stat 命令提供了很多关于文件的详细信息。它不仅提供了文件最近变化的日期/时间，还显示了最近访问文件的时间和权限变化。它可以同时告诉你文件的字节大小和块的数量。它可以显示文件使用的 inode 以及文件类型。它包括了文件所有者和相关用户组的名称和 UID/GID。它以 “rwx”（被称为 “人类可读” 格式）和数字方式显示文件权限。在某些系统中，它甚至可能包括文件创建的日期和时间（称为“出生”）。除了提供所有这些信息外，stat 命令还可以用来创建文件列表。这些列表非常灵活，你可以选择包含上述任何或全部信息。要生成一个自定义列表，你只需要使用 stat 命令的 -c（或 --format）选项，并指定你想要包含的字段。例如，要创建一个以两种格式显示文件权限的列表，使用这个命令：$ stat -c '%n %a %A' my* my.banner 664 -rw-rw-r-- mydir 775 drwxrwxr-x myfile 664 -rw-rw-r-- myjunk 777 lrwxrwxrwx mykey 664 -rw-rw-r-- mylog 664 -rw-rw-r-- myscript 755 -rwxr-xr-x mytext 664 -rw-rw-r-- mytext.bak 664 -rw-rw-r-- mytwin 50 -rw-r----- mywords 664 -rw-rw-r-- 如上例所示，%n 代表文件名，%a 代表八进制的权限，%A 代表 rwx 形式的权限。完整的列表如后面所示。要为这个命令创建一个别名，输入这个命令，或在 .bashrc 文件中添加这个定义。$ alias ls_perms="stat -c '%n %a %A'" 要创建一个非常接近 ls -l 提供的长列表，可以这样做：$ stat -c '%A %h %U %G %s %y %n' my* -rw-rw-r-- 1 shs shs 255 2020-04-01 16:20:00.899374215 -0400 my.banner drwxrwxr-x 2 shs shs 4096 2020-09-07 12:50:20.224470760 -0400 mydir -rw-rw-r-- 1 shs shs 6 2020-05-16 11:12:00.460355387 -0400 myfile lrwxrwxrwx 1 shs shs 11 2020-05-28 18:49:21.666792608 -0400 myjunk -rw-rw-r-- 1 shs shs 655 2020-01-14 15:56:08.540540488 -0500 mykey -rw-rw-r-- 1 shs shs 8 2020-03-04 17:13:21.406874246 -0500 mylog -rwxr-xr-x 1 shs shs 201 2020-09-07 12:50:41.316745867 -0400 myscript -rw-rw-r-- 1 shs shs 40 2019-06-06 08:54:09.538663323 -0400 mytext -rw-rw-r-- 1 shs shs 24 2019-06-06 08:48:59.652712578 -0400 mytext.bak -rw-r----- 2 shs shs 228 2019-04-12 19:37:12.790284604 -0400 mytwin -rw-rw-r-- 1 shs shs 1983 2020-08-10 14:39:57.164842370 -0400 mywords 不同之处包括： 1、不试图将字段排成可辨认的一列，2、日期是 yy-mm-dd 格式，3、时间字段更精确，4、增加了时区（-0400 是 EDT）。如果你想根据最后一次访问的日期来列出文件（例如，用 cat 命令来显示），使用这样的命令：$ stat -c '%n %x' my* | sort -k2 mytwin 2019-04-22 11:25:20.656828964 -0400 mykey 2020-08-20 16:10:34.479324431 -0400 mylog 2020-08-20 16:10:34.527325066 -0400 myfile 2020-08-20 16:10:57.815632794 -0400 mytext.bak 2020-08-20 16:10:57.935634379 -0400 mytext 2020-08-20 16:15:42.323391985 -0400 mywords 2020-08-20 16:…

在 Linux 上调整命令历史
type: item
date: 2020-09-09T07:25:09+08:00
description: 在 Linux 系统上，bash shell 的 history 命令可以方便地回顾和重用命令，但是你要控制它记住多少，忘记多少，有很多事情要做。Linux 系统中的 bash history 命令有助于记住你以前运行过的命令，并重复这些命令，而不必重新输入。如果可以的话，你肯定会很高兴不用翻阅十几页的手册，每过一会再次列出你的文件，而是通过输入 history 查看以前运行的命令。在这篇文章中，我们将探讨如何让 history 命令记住你希望它记住的内容，并忘记那些可能没有什么“历史价值”的命令。查看你的命令历史要查看以前运行过的命令，你只需输入 history。你可能会看到一长串命令。记忆的命令数量取决于在 ~/.bashrc 文件中设置的名为 $HISTSIZE 的环境变量，但是如果你想保存更多或更少的命令，你可以根据你的需要改变这个设置。要查看历史记录，请使用 history 命令：$ history 209 uname -v 210 date 211 man chage ... 要查看将显示的最大命令数量：$ echo $HISTSIZE 500 你可以通过运行这样的命令来改变 $HISTSIZE 并使之永久化：$ export HISTSIZE=1000 $ echo "HISTSIZE=1000" >> ~/.bashrc 在为你保留多少历史记录和当你输入 history 时显示多少历史记录之间也有区别。$HISTSIZE 变量控制显示多少历史记录，而 $HISTFILESIZE 变量控制在你的 .bash_history 文件中保留多少命令。$ echo $HISTSIZE 1000 $ echo $HISTFILESIZE 2000 你可以通过计算历史文件中的行数来验证第二个变量：$ wc -l .bash_history 2000 .bash_history 需要注意的是，在登录会话中输入的命令在注销前不会被添加到你的 .bash_history 文件中，尽管它们会立即显示在 history 命令输出中。使用历史有三种方法可以重发你在 history 中发现的命令。最简单的方法，特别是当你想重用的命令是最近运行的时候，通常是输入一个 ! 后面跟上命令中足够多的首字母来唯一地识别它。$ !u uname -v #37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 另一种简单的重复命令的方法是，只需按上箭头键，直到显示了该命令，然后按回车键。另外，如果你运行 history 命令，并看到你想重新运行的命令被列出，你可以输入一个 ! 后面跟着命令左边显示的序号。$ !209 uname -v #37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 隐藏历史如果你想在一段时间内停止记录命令，你可以使用这个命令：$ set +o history 当你输入 history 时，你输入的命令不会显示出来，当你退出会话或退出终端时，它们也不会被添加到你的 .bash_history 文件中。要取消这个设置，使用 set -o history。要使它永久化，你可以把它添加到你的 .bashrc 文件中，尽管不使用命令历史记录通常不是一个好主意。$ echo 'set +o history' >> ~/.bashrc 要暂时清除历史记录，这样在输入 history 时只显示之后输入的命令，可以使用 history -c（清除）命令：$ history | tail -3 209 uname -v 210 date 211 man chage $ history -c $ history 1 history 注意：在输入 history -c 后输入的命令不会被添加到 .bash_history 文件中。控制历史许多系统上的 history 命令的设置会默认包括一个名为 $HISTCONTROL 的变量，以确保即使你连续运行同一命令七次，也只会被记住一次。它还可以确保你在首先输入一个或多个空格后跟着的命令将从你的命令历史记录中忽略。$ grep HISTCONTROL .bashrc HISTCONTROL=ignoreboth ignoreboth 的意思是“忽略重复的命令和以空格开头的命令”。例如，如果你输入这些命令：$ echo try this $ date $ date $ date $ pwd $ history 你的 history 命令应该像这样报告：$ history $ echo try this $ date $ history 请注意，连续的 date 命令被缩减为一条，以空格缩进的命令被省略。忽略历史要忽略某些命令，使它们在你输入 his…

把 Linux 上的文件列表和排序玩出花来
type: item
date: 2020-08-29T05:38:37+08:00
description: Linux 命令可以提供文件的详细信息，也可以自定义显示的文件列表，甚至可以深入到文件系统的目录中，只要你愿意看。在 Linux 系统上，有许多方法可以列出文件并显示它们的信息。这篇文章回顾了一些提供文件细节的命令，并提供了自定义文件列表的选项，以满足你的需求。大多数命令都会列出单个目录中的文件，而其他命令则可以深入到文件系统的目录中，只要你愿意看。当然，最主要的文件列表命令是 ls。然而，这个命令有大量的选项，可以只查找和列出你想看的文件。另外，还有 find 可以帮助你进行非常具体的文件搜索。按名称列出文件最简单的方法是使用 ls 命令按名称列出文件。毕竟，按名称（字母数字顺序）列出文件是默认的。你可以选择 ls（无细节）或 ls -l（大量细节）来决定你看到什么。$ ls | head -6 8pgs.pdf Aesthetics_Thank_You.pdf alien.pdf Annual_Meeting_Agenda-20190602.pdf bigfile.bz2 bin $ ls -l | head -6 -rw-rw-r-- 1 shs shs 10886 Mar 22 2019 8pgs.pdf -rw-rw-r-- 1 shs shs 284003 May 11 2019 Aesthetics_Thank_You.pdf -rw-rw-r-- 1 shs shs 38282 Jan 24 2019 alien.pdf -rw-rw-r-- 1 shs shs 97358 May 19 2019 Annual_Meeting_20190602.pdf -rw-rw-r-- 1 shs shs 18115234 Apr 16 17:36 bigfile.bz2 drwxrwxr-x 4 shs shs 8052736 Jul 10 13:17 bin 如果你想一次查看一屏的列表，可以将 ls 的输出用管道送到 more 命令中。按相反的名字顺序排列文件要按名称反转文件列表，请添加 -r（ 反转 Reverse ）选项。这就像把正常的列表倒过来一样。$ ls -r $ ls -lr 按文件扩展名列出文件ls 命令不会按内容分析文件类型，它只会处理文件名。不过，有一个命令选项可以按扩展名列出文件。如果你添加了 -X （ 扩展名 eXtension ）选项，ls 将在每个扩展名类别中按名称对文件进行排序。例如，它将首先列出没有扩展名的文件（按字母数字顺序），然后是扩展名为 .1、.bz2、.c 等的文件。只列出目录默认情况下，ls 命令将同时显示文件和目录。如果你想只列出目录，你可以使用 -d（ 目录 Directory ）选项。你会得到一个像这样的列表：$ ls -d */ 1/ backups/ modules/ projects/ templates/ 2/ html/ patches/ public/ videos/ bin/ new/ private/ save/ 按大小排列文件如果你想按大小顺序列出文件，请添加 -S（ 大小 Size ）选项。但请注意，这实际上不会显示文件的大小（以及其他文件的细节），除非你还添加 -l（ 长列表 Long listing ）选项。当按大小列出文件时，一般来说，看到命令在按你的要求做事情是很有帮助的。注意，默认情况下是先显示最大的文件。添加 -r 选项可以反过来（即 ls -lSr）。$ ls -lS total 959492 -rw-rw-r-- 1 shs shs 357679381 Sep 19 2019 sav-linux-free-9.tgz -rw-rw-r-- 1 shs shs 103270400 Apr 16 17:38 bigfile -rw-rw-r-- 1 shs shs 79117862 Oct 5 2019 Nessus-8.7.1-ubuntu1110_amd64.deb 按属主列出文件如果你想按属主列出文件（例如，在一个共享目录中），你可以把 ls 命令的输出传给 sort，并通过添加 -k3 来按第三个字段排序，从而挑出属主一栏。$ ls -l | sort -k3 | more total 56 -rw-rw-r-- 1 dory shs 0 Aug 23 12:27 tasklist drwx------ 2 gdm gdm 4096 Aug 21 17:12 tracker-extract-files.121 srwxr-xr-x 1 root root 0 Aug 21 17:12 ntf_listenerc0c6b8b4567 drwxr-xr-x 2 root root 4096 Aug 21 17:12 hsperfdata…

合并和排序 Linux 上的文件
type: item
date: 2020-08-22T18:23:31+08:00
description: 在 Linux 上合并和排序文本的方法有很多种，但如何去处理它取决于你试图做什么：你是只想将多个文件的内容放入一个文件中，还是以某种方式组织它，让它更易于使用。在本文中，我们将查看一些用于排序和合并文件内容的命令，并重点介绍结果有何不同。使用 cat如果你只想将一组文件放到单个文件中，那么 cat 命令是一个容易的选择。你所要做的就是输入 cat，然后按你希望它们在合并文件中的顺序在命令行中列出这些文件。将命令的输出重定向到要创建的文件。如果指定名称的文件已经存在，那么文件将被覆盖。例如：$ cat firstfile secondfile thirdfile > newfile 如果要将一系列文件的内容添加到现有文件中，而不是覆盖它，只需将 > 变成 >>。$ cat firstfile secondfile thirdfile >> updated_file 如果你要合并的文件遵循一些方便的命名约定，那么任务可能更简单。如果可以使用正则表达式指定所有文件名，那就不必列出所有文件。例如，如果文件全部以 file 结束，如上所示，你可以进行如下操作：$ cat *file > allfiles 请注意，上面的命令将按字母数字顺序添加文件内容。在 Linux 上，一个名为 filea 的文件将排在名为 fileA 的文件的前面，但会在 file7 的后面。毕竟，当我们处理字母数字序列时，我们不仅需要考虑 ABCDE，还需要考虑 0123456789aAbBcCdDeE。你可以使用 ls *file 这样的命令来查看合并文件之前文件的顺序。注意：首先确保你的命令包含合并文件中所需的所有文件，而不是其他文件，尤其是你使用 * 等通配符时。不要忘记，用于合并的文件仍将单独存在，在确认合并后，你可能想要删除这些文件。按时间期限合并文件如果要基于每个文件的时间期限而不是文件名来合并文件，请使用以下命令：$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done 使用 -tr 选项（t = 时间，r = 反向）将产生按照最早的在最前排列的文件列表。例如，如果你要保留某些活动的日志，并且希望按活动执行的顺序添加内容，则这非常有用。上面命令中的 $$ 表示运行命令时的进程 ID。不是很必要使用此功能，但它几乎不可能会无意添加到现有的文件，而不是创建新文件。如果使用 $$，那么生成的文件可能如下所示：$ ls -l BigFile.* -rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914 合并和排序文件Linux 提供了一些有趣的方式来对合并之前或之后的文件内容进行排序。按字母对内容进行排序如果要对合并的文件内容进行排序，那么可以使用以下命令对整体内容进行排序：$ cat myfile.1 myfile.2 myfile.3 | sort > newfile 如果要按文件对内容进行分组，请使用以下命令对每个文件进行排序，然后再将它添加到新文件中：$ for file in `ls myfile.?`; do sort $file >> newfile; done 对文件进行数字排序要对文件内容进行数字排序，请在 sort 中使用 -n 选项。仅当文件中的行以数字开头时，此选项才有用。请记住，按照默认顺序，02 将小于 1。当你要确保行以数字排序时，请使用 -n 选项。$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz 如果文件中的行以 2020-11-03 或 2020/11/03（年月日格式）这样的日期格式开头，-n 选项还能让你按日期对内容进行排序。其他格式的日期排序将非常棘手，并且将需要更复杂的命令。使用 pastepaste 命令允许你逐行连接文件内容。使用此命令时，合并文件的第一行将包含要合并的每个文件的第一行。以下是示例，其中我使用了大写字母以便于查看行的来源：$ cat file.a A one A two A three $ paste file.a file.b file.c A one B one C one A two B two C two A three B three C thee B four C four C five 将输出重定向到另一个文件来保存它：$ paste file.a file.b file.c > merged_content 或者，你可以将每个文件的内容在同一行中合并，然后将文件粘贴在一起。这需要使用 -s（序列）选项。注意这次的输出如何显示每个文件的内容：$ paste -s file.a file.b file…

汇总你在 Linux 上的命令使用情况
type: item
date: 2020-08-15T06:16:06+08:00
description: 使用合适的命令，你可以快速了解 Linux 系统上使用的命令以及执行的频率。汇总 Linux 系统上使用的命令只需一串相对简单的命令以及几条管道将它们绑定在一起。当你的历史记录缓冲区保留了最近的 1,000 或 2,000 条命令时，总结你的命令活动可能会变得很乏味。这篇文章提供了一种方便的方法来汇总命令的使用情况，并高亮显示最常用的命令。首先，请记住，典型的命令历史记录可能看起来像这样。请注意，命令是显示在命令序列号之后，并紧跟其参数。91 sudo apt-get install ccrypt ^ +-- command 请注意，history 命令遵循 HISTSIZE 的设置，这会决定保留多少条命令。可能是 500、1,000 或更多。如果你不喜欢它的设置，那么可以在 .bashrc 或其他启动文件中添加或更改 HISTSIZE 设置。$ echo $HISTSIZE 1000 $ history | wc -l 1000 $ grep HISTSIZE ~/.bashrc # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 记下大量命令的主要好处之一是，它可以让你轻松地重新运行过去使用的命令，而不必重新输入或记住它们。它还能让你轻松地查看你在一个任务中已经做了多少工作。单独使用 history 命令时，你会看到类似下面这样，最早的在最前面：$ history 7 vi tasks 8 alias 9 echo $HISTTIMEFORMAT 10 history 11 date … 查看最新使用命令需要查看记录的命令的尾部：$ history | tail -4 1007 echo $HISTSIZE 1008 history | wc -l 1009 history 1010 history | tail -4 另外，你可以使用 tail 命令查看 .bash_history 文件的尾部，但是 history 命令显示的数字可以让你输入如 !1010 这样的数字重新运行命令，这点通常更有用。要提供已使用命令的汇总（例如 vi 和 echo），你可以首先使用 awk 将命令与 history 中保存的其他信息分隔开来：$ history | awk '{print $2}' vi alias echo history date … 如果你将历史记录中的命令列表传递给 sort 命令以按字母顺序对命令进行分组，那么会得到以下内容：$ history | awk '{print $2}' | sort 7z 7z alias apropos cd cd … 接下来，将 sort 命令的输出传递给 uniq -c ，这将计算每个命令使用了多少次：$ history | awk '{print $2}' | sort | uniq -c 2 7z 1 alias 2 apropos 38 cd 21 chmod … 最后，添加第二个 sort 命令按倒序对命令组计数进行排序，这将先列出最常用的命令：$ history | awk '{print $2}' | sort | uniq -c | sort -nr 178 ls 95 vi 63 cd 53 sudo 41 more … 这样可以让你了解使用最多的命令，但不会包括任何你可能故意从历史记录文件中删除的命令，例如：HISTIGNORE="pwd:clear:man:history" 当修改了历史记录格式时对于默认的历史记录格式，history 命令输出中的第一个字段将是每个命令的序号，第二个字段是使用的命令。因此，上面所有 awk 命令都设置成显示 $2。$ alias cmds='history | awk '\''{print $2}'\'' | sort | uniq -c | sort -nr' 如果你像下面那样将日期和时间添加了到 history 命令中，那么你还必须修改所设置的别名：$ echo $HISTTIMEFORMAT %d/%m/%y %T 这个日期/时间信息有时会很有帮助，但是这意味着你必须在选择 history 命令的第 4 个字段而不是第 2 个字段来汇总命令，因为你的历史记录条目将如下所示：91 05/07/20 16:37:39 sudo apt-get install ccrypt ^ +-- command 因此，在将 $2 变为 $4 之后，用于检查 history 命令的别名将改为这样：$ alias cmds='history | awk '\''{print $4}'\'' | sort | uniq -c |…