Back to prev

Linux command tools

Feb 21, 2020
Linkang Chan
@Jesse Chan
incoming (1):shell script

Linux 的命令行工具一直在发展,一些内置的工具也在不断的进化,单论GNU分支出来的工具,增加了很多选项,所以在日常使用的时候,同样的工具在不同的发行版上的选项和行为会略有不同。我们正常能掌握的工具使用也是有限的,一个好的方式是在实践中不断积累,以期在有问题时快速组合不同工具的输入输出并解决问题。

本篇主要是记录工作中遇到的一些命令的使用,单纯的去看这些工具的 man page 往往不太能想到一些创造性的使用方式,或者只能知其是什么,但遇到问题时并不会想到如何去用。

P.S. 记得将一些复杂的单行命令写在脚本里。

fold(1)

这个命令主要是为了将输出的行转换到指定的宽度。类似于文档中的软换行。这在显示一个超长文本时很有用。但是如果遇到下面这个问题时,fold 可以很轻松的解决。

Input:  aaaabbbcca
Output: [("a", 4), ("b", 3), ("c", 2), ("a", 1)]

忽略最终输出的数组形式,使用 fold 搭配 uniq 只需要一行就可以解决。

$ echo "aaaabbbcca" | fold -w 1 | uniq -c
4 a
3 b
2 c
1 a

其中-w 1表示的一行的宽度是多少,默认是 80,当指定成 1 时,表示一行只输出一个字符。这样就可以通过 uniq 进行统计了。

truncate

用于扩展或者缩减文件大小,非常适合在 linux 上创建一个空洞文件。

$ truncate -s 1G test.txt
$ ls -l test.txt
.rw-r--r-- 1024M jesse 21 4 17:48 test.txt
$ truncate -s 629M test.txt
$ ls -l test.txt
.rw-r--r-- 629M jesse 21 4 17:48 bigfile

unzip

  • 检查当前 zip 文件是否完整
if ! unzip -t "$target" &> /dev/null; then
    echo "file is encrypted"
fi
  • 忽略顶层目录,并解压到指定目录
unzip -j "$target" -d "$dst_dir" 

nsenter

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

nsenter [options] [program [arguments]]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL

比如我们可以进入到某个 docker 容器的进程下,在此进程下执行 netstat 等命令,具体操作如下:

$ docker inspect -f {{.State.Pid}} <container_name>
1234

$ nsenter -n -t 1234
# 此时则进入到了容器的进程下,可以进行 netstat 等操作