Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

对于那些主要通过控制台或终端使用 Linux 命令行来工作的 Linux 用户来说,他们真切地感受到了 Linux 的强大。 然而在 Linux 的分层文件系统中进行导航有时或许是一件头疼的事,尤其是对于那些新手来说。

现在,有一个用 Python 写的名为 autojump 的 Linux 命令行实用程序,它是 Linux ‘cd’命令的高级版本。

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

Autojump – Linux 文件系统导航的最快方式

这个应用原本由 Joël Schaerer 编写,现在由 +William Ting 维护。

Autojump 应用可以从用户那里学习并帮助用户在 Linux 命令行中进行更轻松的目录导航。与传统的 cd 命令相比,autojump 能够更加快速地导航至目的目录。

autojump 的特色

  • 自由开源的应用,在 GPL V3 协议下发布。
  • 自主学习的应用,从用户的导航习惯中学习。
  • 更快速地导航。不必包含子目录的名称。
  • 对于大多数的标准 Linux 发行版本,能够在软件仓库中下载得到,它们包括 Debian (testing/unstable), Ubuntu, Mint, Arch, Gentoo, Slackware, CentOS, RedHat 和 Fedora。
  • 也能在其他平台中使用,例如 OS X(使用 Homebrew) 和 Windows (通过 Clink 来实现)
  • 使用 autojump 你可以跳至任何特定的目录或一个子目录。你还可以用文件管理器打开某个目录,并查看你在某个目录中所待时间的统计数据。

前提

  • 版本号不低于 2.6 的 Python

第 1 步: 做一次完整的系统升级

1、 以 root 用户的身份,做一次系统更新或升级,以此保证你安装有最新版本的 Python。

# apt-get update && apt-get upgrade && apt-get dist-upgrade [基于 APT 的系统]
# yum update && yum upgrade [基于 YUM 的系统]
# dnf update && dnf upgrade [基于 DNF 的系统]

: 这里特别提醒,在基于 YUM 或 DNF 的系统中,更新和升级执行相同的行动,大多数时间里它们是通用的,这点与基于 APT 的系统不同。

第 2 步: 下载和安装 Autojump

2、 正如前面所言,在大多数的 Linux 发行版本的软件仓库中, autojump 都可获取到。通过包管理器你就可以安装它。但若你想从源代码开始来安装它,你需要克隆源代码并执行 python 脚本,如下面所示:

从源代码安装

若没有安装 git,请安装它。我们需要使用它来克隆 git 仓库。

# apt-get install git   [基于 APT 的系统]
# yum install git       [基于 YUM 的系统]
# dnf install git       [基于 DNF 的系统]

一旦安装完 git,以普通用户身份登录,然后像下面那样来克隆 autojump:

$ git clone git://github.com/joelthelion/autojump.git

接着,使用 cd 命令切换到下载目录。

$ cd autojump

下载,赋予安装脚本文件可执行权限,并以 root 用户身份来运行安装脚本。

# chmod 755 install.py
# ./install.py

从软件仓库中安装

3、 假如你不想麻烦,你可以以 root 用户身份从软件仓库中直接安装它:

在 Debian, Ubuntu, Mint 及类似系统中安装 autojump :

# apt-get install autojump

为了在 Fedora, CentOS, RedHat 及类似系统中安装 autojump, 你需要启用 EPEL 软件仓库

# yum install epel-release
# yum install autojump
或
# dnf install autojump

第 3 步: 安装后的配置

4、 在 Debian 及其衍生系统 (Ubuntu, Mint,…) 中, 激活 autojump 应用是非常重要的。

为了暂时激活 autojump 应用,即直到你关闭当前会话或打开一个新的会话之前让 autojump 均有效,你需要以常规用户身份运行下面的命令:

$ source /usr/share/autojump/autojump.sh on startup

为了使得 autojump 在 BASH shell 中永久有效,你需要运行下面的命令。

$ echo '. /usr/share/autojump/autojump.sh' >> ~/.bashrc

第 4 步: Autojump 的预测试和使用

5、 如先前所言, autojump 将只跳到先前 cd 命令到过的目录。所以在我们开始测试之前,我们要使用 cd 切换到一些目录中去,并创建一些目录。下面是我所执行的命令。

$ cd
$ cd
$ cd Desktop/
$ cd
$ cd Documents/
$ cd
$ cd Downloads/
$ cd
$ cd Music/
$ cd
$ cd Pictures/
$ cd
$ cd Public/
$ cd
$ cd Templates
$ cd
$ cd /var/www/
$ cd
$ mkdir autojump-test/
$ cd
$ mkdir autojump-test/a/ && cd autojump-test/a/
$ cd
$ mkdir autojump-test/b/ && cd autojump-test/b/
$ cd
$ mkdir autojump-test/c/ && cd autojump-test/c/
$ cd

现在,我们已经切换到过上面所列的目录,并为了测试创建了一些目录,一切准备就绪,让我们开始吧。

需要记住的一点 : j 是 autojump 的一个封装,你可以使用 j 来代替 autojump, 相反亦可。

6、 使用 -v 选项查看安装的 autojump 的版本。

$ j -v
或
$ autojump -v

查看 Autojump 的版本

查看 Autojump 的版本

7、 跳到先前到过的目录 ‘/var/www‘。

$ j www

跳到目录

跳到目录

8、 跳到先前到过的子目录‘/home/avi/autojump-test/b‘ 而不键入子目录的全名。

$ jc b

跳到子目录

跳到子目录

9、 使用下面的命令,你就可以从命令行打开一个文件管理器,例如 GNOME Nautilus ,而不是跳到一个目录。

$ jo www

打开目录

打开目录

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

在文件管理器中打开目录

你也可以在一个文件管理器中打开一个子目录。

$ jco c

打开子目录

打开子目录

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

在文件管理器中打开子目录

10、 查看每个文件夹的权重和全部文件夹计算得出的总权重的统计数据。文件夹的权重代表在这个文件夹中所花的总时间。 文件夹权重是该列表中目录的数字。(LCTT 译注: 在这一句中,我觉得原文中的 if 应该为 is)

$ j --stat
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

查看文件夹统计数据

提醒 : autojump 存储其运行日志和错误日志的地方是文件夹 ~/.local/share/autojump/。千万不要重写这些文件,否则你将失去你所有的统计状态结果。

$ ls -l ~/.local/share/autojump/

Autojump 的日志

Autojump 的日志

11、 假如需要,你只需运行下面的命令就可以查看帮助 :

$ j --help
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

Autojump 的帮助和选项

功能需求和已知的冲突

  • autojump 只能让你跳到那些你已经用 cd 到过的目录。一旦你用 cd 切换到一个特定的目录,这个行为就会被记录到 autojump 的数据库中,这样 autojump 才能工作。不管怎样,在你设定了 autojump 后,你不能跳到那些你没有用 cd 到过的目录。
  • 你不能跳到名称以破折号 (-) 开头的目录。或许你可以考虑阅读我的有关操作文件或目录 的文章,尤其是有关操作那些以‘-‘ 或其他特殊字符开头的文件和目录的内容。
  • 在 BASH shell 中,autojump 通过修改 $PROMPT_COMMAND 环境变量来跟踪目录的行为,所以强烈建议不要去重写 $PROMPT_COMMAND 这个环境变量。若你需要添加其他的命令到现存的 $PROMPT_COMMAND 环境变量中,请添加到$PROMPT_COMMAND 环境变量的最后。

结论:

假如你是一个命令行用户, autojump 是你必备的实用程序。它可以简化许多事情。它是一个在命令行中导航 Linux 目录的绝佳的程序。请自行尝试它,并在下面的评论框中让我知晓你宝贵的反馈。保持联系,保持分享。喜爱并分享,帮助我们更好地传播。


via: http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/

作者:Avishek Kumar 译者:FSSlc 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5983-1.html

修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

这两天我安装了Elementary OS和Windows双系统,在启动的时候遇到了一个Grub错误。命令行中呈现如下信息:

Minimal BASH like line editing is supported. For the first word, TAB lists possible command completions. anywhere else TAB lists possible device or file completions.

提供类似行编辑的袖珍 BASH。TAB键补全第一个词,列出可以使用的命令。除此之外,TAB键补全可以列出可用的设备或文件。

修复Linux中的“提供类似行编辑的袖珍BASH...”的GRUB错误
修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

事实上这并不是Elementary OS独有的错误。这是常见的Grub错误,会在Ubuntu,Fedora,Linux Mint等Linux操作系统上发生。

通过这篇文章里我们可以学到基于Linux系统如何修复Ubuntu中出现的“minimal BASH like line editing is supported” Grub错误

你可以参阅这篇教程来修复类似的常见问题,错误:分区未找到Linux grub救援模式

先决条件

要修复这个问题,你需要达成以下的条件:

  • 一个包含相同版本、相同OS的LiveUSB或磁盘
  • 当前会话的Internet连接正常工作

在确认了你拥有先决条件了之后,让我们看看如何修复Linux的死亡黑屏(如果我可以这样的称呼它的话 😉 )。

如何在基于Ubuntu的Linux中修复“minimal BASH like line editing is supported” Grub错误

我知道你一定疑问这种Grub错误并不局限于在基于Ubuntu的Linux发行版上发生,那为什么我要强调在基于Ubuntu的发行版上呢?原因是,在这里我们将采用一个简单的方法,用个叫做Boot Repair的工具来修复我们的问题。我并不确定在其他的诸如Fedora的发行版中是否有这个工具可用。不再浪费时间,我们来看如何修复“minimal BASH like line editing is supported” Grub错误。

步骤 1: 引导进入lives会话

插入live USB,引导进入live会话。

步骤 2: 安装 Boot Repair

等你进入了lives会话后,打开终端使用以下命令来安装Boot Repair:

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair

注意:推荐这篇教程如何修复 apt-get update 无法添加新的 CD-ROM 的错误,如果你在运行以上命令是遭遇同样的问题。

步骤 3: 使用Boot Repair修复引导

装完Boot Repair后,在命令行运行如下命令启动:

boot-repair &

其实操作非常简单直接,你仅需按照Boot Repair工具提供的说明操作即可。首先,点击Boot Repair中的Recommended repair选项。

修复Linux中的“提供类似行编辑的袖珍BASH...”的GRUB错误
修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

Boot Repair需要花费一些时间来分析引导和Grub中存在的问题。然后,它会提供一些可在命令行中直接运行的命令。将这些命令一个个在终端中执行。我这边屏幕上显示的是:

修复Linux中的“提供类似行编辑的袖珍BASH...”的GRUB错误
修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

在输入了这些命令之后,它会执行执行一段时间:

在这一过程结束后,它会提供一个由boot repair的日志组成的网页网址。如果你的引导问题这样都没有修复,你就可以去社区或是发邮件给开发团队并提交该网址作为参考。很酷!不是吗?

修复Linux中的“提供类似行编辑的袖珍BASH...”的GRUB错误
修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

在boot repair成功完成后,关闭你的电脑,移除USB并再次引导。我这就能成功的引导了,但是在Grub画面上会多出额外的两行。相比于看到系统能够再次正常引导的喜悦这些对我来说并不重要。

修复Linux中的“提供类似行编辑的袖珍BASH...”的GRUB错误
修复Linux中的“提供类似行编辑的袖珍BASH…”的GRUB错误

对你有效吗?

这就是我修复Elementary OS Freya中的minimal BASH like line editing is supported Grub 错误的方法。怎么样?是否对你也有效呢?请自由的在下方的评论区提出你的问题和建议。


via: http://itsfoss.com/fix-minimal-bash-line-editing-supported-grub-error-linux/

作者:Abhishek 译者:martin2011qi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5909-1.html

在 Linux 命令行中使用和执行 PHP 代码(一)

PHP是一个开源服务器端脚本语言,最初这三个字母代表的是“Personal Home Page”,而现在则代表的是“PHP:Hypertext Preprocessor”,它是个递归首字母缩写。它是一个跨平台脚本语言,深受C、C++和Java的影响。

在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

在 Linux 命令行中运行 PHP 代码

PHP的语法和C、Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被2.6亿个网站所使用,当前最新的稳定版本是PHP版本5.6.10。

PHP是HTML的嵌入脚本,它便于开发人员快速写出动态生成的页面。PHP主要用于服务器端(而Javascript则用于客户端)以通过HTTP生成动态网页,然而,当你知道可以在Linux终端中不需要网页浏览器来执行PHP时,你或许会大为惊讶。

本文将阐述PHP脚本语言的命令行方面。

1. 在安装完PHP和Apache2后,我们需要安装PHP命令行解释器。

# apt-get install php5-cli          [Debian 及类似系统]
# yum install php-cli               [CentOS 及类似系统]

接下来我们通常要做的是,在/var/www/html(这是 Apache2 在大多数发行版中的工作目录)这个位置创建一个内容为 ,名为 infophp.php 的文件来测试(PHP是否安装正确),执行以下命令即可。

# echo '' > /var/www/html/infophp.php

然后,将浏览器访问 http://127.0.0.1/infophp.php ,这将会在网络浏览器中打开该文件。

在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

检查PHP信息

不需要任何浏览器,在Linux终端中也可以获得相同的结果。在Linux命令行中执行/var/www/html/infophp.php,如:

# php -f /var/www/html/infophp.php
在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

从命令行检查PHP信息

由于输出结果太大,我们可以通过管道将上述输出结果输送给 less 命令,这样就可以一次输出一屏了,命令如下:

# php -f /var/www/html/infophp.php | less
在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

检查所有PHP信息

这里,‘-f‘选项解析并执行命令后跟随的文件。

2. 我们可以直接在Linux命令行使用phpinfo()这个十分有价值的调试工具而不需要从文件来调用,只需执行以下命令:

# php -r 'phpinfo();'
在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

PHP调试工具

这里,‘-r‘ 选项会让PHP代码在Linux终端中不带<>标记直接执行。

3. 以交互模式运行PHP并做一些数学运算。这里,‘-a‘ 选项用于以交互模式运行PHP。

# php -a

Interactive shell

php > echo 2+3;
5
php > echo 9-6;
3
php > echo 5*4;
20
php > echo 12/3;
4
php > echo 12/5;
2.4
php > echo 2+3-1;
4
php > echo 2+3-1*3;
2
php > exit

输入 ‘exit‘ 或者按下 ‘ctrl+c‘ 来关闭PHP交互模式。

在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

启用PHP交互模式

4. 你可以仅仅将PHP脚本作为shell脚本来运行。首先,创建在你当前工作目录中创建一个PHP样例脚本。

# echo -e '#!/usr/bin/phpn' > phpscript.php

注意,我们在该PHP脚本的第一行使用#!/usr/bin/php,就像在shell脚本中那样(/bin/bash)。第一行的#!/usr/bin/php告诉Linux命令行用 PHP 解释器来解析该脚本文件。

其次,让该脚本可执行:

# chmod 755 phpscript.php

接着来运行它,

# ./phpscript.php

5. 你可以完全靠自己通过交互shell来创建简单函数,这你一定会被惊到了。下面是循序渐进的指南。

开启PHP交互模式。

# php -a

创建一个函数,将它命名为 addition。同时,声明两个变量 $a$b

php > function addition ($a, $b)

使用花括号来在其间为该函数定义规则。

php > {

定义规则。这里,该规则讲的是添加这两个变量。

php { echo $a + $b;

所有规则定义完毕,通过闭合花括号来封装规则。

php {}

测试函数,添加数字4和3,命令如下:

php > var_dump (addition(4,3));

样例输出

7NULL

你可以运行以下代码来执行该函数,你可以测试不同的值,你想来多少次都行。将里头的 a 和 b 替换成你自己的值。

php > var_dump (addition(a,b));

php > var_dump (addition(9,3.3));

样例输出

12.3NULL
在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

创建PHP函数

你可以一直运行该函数,直至退出交互模式(ctrl+z)。同时,你也应该注意到了,上面输出结果中返回的数据类型为 NULL。这个问题可以通过要求 php 交互 shell用 return 代替 echo 返回结果来修复。

只需要在上面的函数的中 ‘echo‘ 声明用 ‘return‘ 来替换

替换

php { echo $a + $b;

php { return $a + $b;

剩下的东西和原理仍然一样。

这里是一个样例,在该样例的输出结果中返回了正确的数据类型。

在 Linux 命令行中使用和执行 PHP 代码(一)
在 Linux 命令行中使用和执行 PHP 代码(一)

PHP函数

永远都记住,用户定义的函数不会从一个shell会话保留到下一个shell会话,因此,一旦你退出交互shell,它就会丢失了。

希望你喜欢此次教程。保持连线,你会获得更多此类文章。保持关注,保持健康。请在下面的评论中为我们提供有价值的反馈。点赞并分享,帮助我们扩散。

还请阅读: 12个Linux终端中有用的的PHP命令行用法——第二部分


via: http://www.tecmint.com/run-php-codes-from-linux-commandline/

作者:Avishek Kumar 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5906-1.html

Linux:Shell脚本:使用rsync备份文件/目录

Linux:Shell脚本:使用rsync备份文件/目录
Linux:Shell脚本:使用rsync备份文件/目录

本文我们介绍一个shell脚本,用来使用rsync命令将你本地Linux机器上的文件/目录备份到远程Linux服务器上。使用该脚本会以交互的方式实施备份,你需要提供远程备份服务器的主机名/ip地址和文件夹位置。我们使用一个单独的列表文件,在这个文件中你需要列出要备份的文件/目录。我们添加了两个脚本,第一个脚本在每次拷贝完一个文件后询问密码(如果你启用了ssh密钥验证,那么就不会询问密码),而第二个脚本中,则只会提示一次输入密码。

我们打算备份bckup.txt,dataconfig.txt,docs和orcledb。

[root@Fedora21 tmp]# ls -l
total 12
-rw-r--r--. 1 root root 0 May 15 10:43 bckrsync.sh
-rw-r--r--. 1 root root 0 May 15 10:44 bckup.txt
-rw-r--r--. 1 root root 0 May 15 10:46 dataconfig.txt
drwxr-xr-x. 2 root root 4096 May 15 10:45 docs
drwxr-xr-x. 2 root root 4096 May 15 10:44 oracledb

bckup.txt文件包含了需要备份的文件/目录的详情

[root@Fedora21 tmp]# cat /tmp/bckup.txt
/tmp/oracledb
/tmp/dataconfig.txt
/tmp/docs
[root@Fedora21 tmp]#

脚本 1:

#!/bin/bash

# 将备份列表文件的路径保存到变量中
backupf='/tmp/bckup.txt'

# 输入一个提示信息
echo "Shell Script Backup Your Files / Directories Using rsync"

# 检查是否输入了目标服务器,如果为空就再次提示用户输入
while [ x$desthost = "x" ]; do

# 提示用户输入目标服务器地址并保存到变量
read -p "Destination backup Server : " desthost

# 结束循环
done

# 检查是否输入了目标文件夹,如果为空就再次提示用户输入
while [ x$destpath = "x" ]; do

# 提示用户输入目标文件夹并保存到变量
read -p "Destination Folder : " destpath

# 结束循环
done

# 逐行读取备份列表文件
for line in `cat $backupf`

# 对每一行都进行处理
do

# 显示要被复制的文件/文件夹名称
echo "Copying $line ... "
# 通过 rsync 复制文件/文件夹到目标位置

rsync -ar "$line" "$desthost":"$destpath"

# 显示完成
echo "DONE"

# 结束
done

运行带有输出结果的脚本

[root@Fedora21 tmp]# ./bckrsync.sh
Shell Script Backup Your Files / Directories Using rsync
Destination backup Server : 104.*.*.41
Destination Folder : /tmp
Copying /tmp/oracledb ...
The authenticity of host '104.*.*.41 (104.*.*.41)' can't be established.
ECDSA key fingerprint is 96:11:61:17:7f:fa:......
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '104.*.*.41' (ECDSA) to the list of known hosts.
root@104.*.*.41's password:
DONE
Copying /tmp/dataconfig.txt ...
root@104.*.*.41's password:
DONE
Copying /tmp/docs ...
root@104.*.*.41's password:
DONE
[root@Fedora21 tmp]#

脚本 2:

#!/bin/bash

# 将备份列表文件的路径保存到变量中
backupf='/tmp/bckup.txt'

# 输入一个提示信息
echo "Shell Script Backup Your Files / Directories Using rsync"

# 检查是否输入了目标服务器,如果为空就再次提示用户输入
while [ x$desthost = "x" ]; do

# 提示用户输入目标服务器地址并保存到变量
read -p "Destination backup Server : " desthost

# 结束循环
done

# 检查是否输入了目标文件夹,如果为空就再次提示用户输入
while [ x$destpath = "x" ]; do

# 提示用户输入目标文件夹并保存到变量
read -p "Destination Folder : " destpath

# 结束循环
done

# 检查是否输入了目标服务器密码,如果为空就再次提示用户输入
while [ x$password = "x" ]; do
# 提示用户输入密码并保存到变量
# 使用 -s 选项不回显输入的密码
read -sp "Password : " password
# 结束循环
done

# 逐行读取备份列表文件
for line in `cat $backupf`

# 对每一行都进行处理
do

# 显示要被复制的文件/文件夹名称
echo "Copying $line ... "
# 使用 expect 来在脚本中输入密码
/usr/bin/expect << EOD
# 推荐设置超时为 -1
set timeout -1
# 通过 rsync 复制文件/文件夹到目标位置,使用 expect 的组成部分 spawn 命令

spawn rsync -ar ${line} ${desthost}:${destpath}
# 上一行命令会等待 “password” 提示
expect "*?assword:*"
# 在脚本中提供密码
send "${password}r"
# 等待文件结束符(远程服务器处理完了所有事情)
expect eof
# 结束 expect 脚本
EOD
# 显示结束
echo "DONE"

# 完成
done

运行第二个带有输出结果的脚本的屏幕截图

Linux:Shell脚本:使用rsync备份文件/目录
Linux:Shell脚本:使用rsync备份文件/目录

希望这些脚本对你备份会有帮助!!


via: http://linoxide.com/linux-shell-script/shell-script-backup-files-directories-rsync/

作者:Yevhen Duma 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5694-1.html

Linux:命令行艺术

Linux:命令行艺术
Linux:命令行艺术

流畅地使用命令行是一个常被忽略的技能,或被认为是神秘的奥义。但是,它会以明显而微妙的方式改善你作为工程师的灵活度和生产力。这是我在 Linux 上工作时发现的有用的命令行使用小窍门和笔记的精粹。有些小窍门是很基础的,而有些是相当地特别、复杂、或者晦涩难懂。这篇文章不长,但是如果你可以使用并记得这里的所有内容,那么你就懂得很多了。

其中大部分最初出现Quora上,但是考虑到兴趣所在,似乎更应该放到 Github 上,这里的人比我更能提出改进建议。如果你看到一个错误,或者更好的某种东西,请提交问题或 PR!(当然,提交前请看看必读小节和已有的 PR/Issue。)

必读

范围:

  • 本文是针对初学者和专业人员的,选题目标是覆盖面广(全都很重要)、有针对性(大多数情况下都给出具体实例)而简洁(避免不必要内容以及你能在其它地方轻松找到的离题的内容)。每个小窍门在某种情形下都很必需的,或者能比替代品大大节省时间。
  • 这是为 Linux 写的。绝大部分条目都可以同样应用到 MacOS(或者甚至 Cygwin)。
  • 主要针对交互式 Bash,尽管大多数小窍门也可以应用到其它 shell,以及常规 Bash 脚本。
  • 包括了“标准的”UNIX 命令以及那些需要安装的软件包(它们很重要,值得安装)。

注意:

  • 为了能在一篇文章内展示尽量多的东西,一些具体的信息会被放到引用页里。你可以使用 Google 来获得进一步的内容。(如果需要的话,)你可以使用 apt-get/
    1
    yum

    /

    1
    dnf

    /

    1
    pacman

    /

    1
    pip

    /

    1
    2
    3
    4
    5
    6
    7
    brew</b1>来安装这些新的程序。</li>
    <li>使用 <a href="http://explainshell.com/">Explainshell</a> 来获取命令、参数、管道等内容的解释。</li>
    </ul>
    <h2 id="toc_2">基础</h2>
    <ul>
    <li>
    <p>学习基本 Bash 技能。实际上,键入<b1>man bash

    ,然后至少浏览一遍所有内容;它很容易理解,没那么长。其它 shell 也不错,但是 Bash 很强大,而且到处都可以找到(如果在你自己的笔记本上学习 zsh、fish 之类,会在很多情形下受到限制,比如使用现存的服务器时)。

  • 至少学好一种基于文本的编辑器。理想的一个是 Vim(

    1
    vi

    ),因为在终端中编辑时随时都能找到它(即使大多数时候你在使用 Emacs、一个大型的 IDE、或一个现代的时髦编辑器)。

  • 学习怎样使用

    1
    2
    3
    4
    5
    6
    7
    man</b1>来阅读文档(好奇的话,用 <b1>man man</b1>来列出分区号,比如 1 是常规命令,5 是文件描述,8 用于管理员)。用 <b1>apropos</b1>找到帮助页。了解哪些命令不是可执行程序,而是 Bash 内置的,你可以用 <b1>help</b1>和 <b1>help -d</b1>得到帮助。</p>
    </li>
    <li>
    <p>学习使用 <b1>></b1>和 <b1><</b1>来进行输出和输入重定向,以及使用 <b1>|</b1>来管道重定向,学习关于 stdout 和 stderr 的东西。</p>
    </li>
    <li>
    <p>学习 <b1>*

    (也许还有

    1
    ?</b1>和 <b1>{

    1
    2
    3
    4
    }</b1>)文件通配扩展和应用,以及双引号 <b1>"</b1>和单引号 <b1>'</b1>之间的区别。(更多内容请参看下面关于变量扩展部分)。</p>
    </li>
    <li>
    <p>熟悉 Bash 作业管理:<b1>&

    ctrl-zctrl-c

    1
    jobs

    1
    fg

    1
    bg

    1
    2
    3
    4
    kill</b1>等等。</p>
    </li>
    <li>
    <p>掌握<b1>ssh

    ,以及通过

    1
    ssh-agent

    1
    2
    3
    4
    ssh-add</b1>等进行无密码验证的基础技能。</p>
    </li>
    <li>
    <p>基本的文件管理:<b1>ls</b1>和 <b1>ls -l

    (特别是,知道

    1
    ls -l

    各个列的意义),

    1
    less

    1
    head

    1
    tail</b1>和 <b1>tail -f

    (或者更好的

    1
    less +F

    ),

    1
    ln</b1>和 <b1>ln -s

    (知道硬链接和软链接的区别,以及硬链接相对于软链接的优势),

    1
    chown

    1
    chmod

    1
    du

    (用于查看磁盘使用率的快速摘要:

    1
    du -sk *

    )。文件系统管理:

    1
    df

    1
    mount

    1
    fdisk

    1
    mkfs

    1
    lsblk

  • 基本的网络管理:

    1
    ip</b1>或 <b1>ifconfig

    1
    dig

  • 熟知正则表达式,以及各种使用

    1
    grep

    /

    1
    egrep

    的选项。

    1
    -i

    1
    -o

    1
    2
    3
    4
    -A</b1>和 <b1>-B</b1>选项值得掌握。</p>
    </li>
    <li>
    <p>学会使用 <b1>apt-get

    1
    yum</b1>,<b1>dnf</b1>或 <b1>pacman

    (这取决于你的发行版)来查找并安装软件包。确保你可以用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    pip</b1>来安装基于 Python 的命令行工具(下面的一些东西可以很容易地通过 <b1>pip</b1>安装)。</p>
    </li>
    </ul>
    <h2 id="toc_3">日常使用</h2>
    <ul>
    <li>
    <p>在Bash中,使用 <strong>tab</strong> 补完参数,使用 <strong>ctrl-r</strong> 来搜索命令历史。</p>
    </li>
    <li>
    <p>在Bash中,使用 <strong>ctrl-w</strong> 来删除最后的单词,使用 <strong>ctrl-u</strong> 来删除整行,返回行首。使用 <strong>alt-b</strong> 和 <strong>alt-f</strong> 来逐词移动,使用 <strong>ctrl-k</strong> 来清除到行尾的内容,以及使用 <strong>ctrl-l</strong> 清屏。参见 man readline 来查看 Bash 中所有默认的键盘绑定,有很多。例如,<strong>alt-.</strong> 可以循环显示先前的参数,而<strong>alt-</strong> 扩展通配。(LCTT 译注:关于 Bash 下的快捷键,可以参阅: <a href="https://linux.cn/article-5660-1.html">https://linux.cn/article-5660-1.html</a> )</p>
    </li>
    <li>
    <p>另外,如果你喜欢 vi 风格的键盘绑定,可以使用 set -o vi。</p>
    </li>
    <li>
    <p>要查看最近用过的命令,请使用 history 。 有许多缩写形式,比如 !$(上次的参数)和!!(上次的命令),虽然使用 ctrl-r 和 alt-. 更容易些。(LCTT 译注:关于历史扩展功能,可以参阅: <a href="https://linux.cn/article-5658-1.html">https://linux.cn/article-5658-1.html</a> )</p>
    </li>
    <li>
    <p>返回先前的工作目录: cd -</p>
    </li>
    <li>
    <p>如果你命令输入到一半,但是改变主意了,可以敲 <strong>alt-#</strong> 来添加一个 # 到开头,然后将该命令作为注释输入(或者使用快捷键 <strong>ctrl-a</strong>, <strong>#</strong>,<strong>enter</strong> 输入)。然后,你可以在后面通过命令历史来回到该命令。</p>
    </li>
    <li>
    <p>使用 xargs(或 parallel),它很强大。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:</p>
    <pre class="prettyprint ">  find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
    </pre>
    </li>
    <li>
    <p>pstree -p 对于显示进程树很有帮助。</p>
    </li>
    <li>
    <p>使用 pgrep 和 pkill 来按名称查找进程或给指定名称的进程发送信号(-f 很有帮助)。</p>
    </li>
    <li>
    <p>掌握各种可以发送给进程的信号。例如,要挂起进程,可以使用 kill -STOP [pid]。完整的列表可以查阅 man 7 signal。</p>
    </li>
    <li>
    <p>如果你想要一个后台进程一直保持运行,使用 nohup 或 disown。</p>
    </li>
    <li>
    <p>通过 netstat -lntp 或 ss -plat 检查哪些进程在监听(用于 TCP,对 UDP 使用 -u 替代 -t)。</p>
    </li>
    <li>
    <p>lsof来查看打开的套接字和文件。</p>
    </li>
    <li>
    <p>在 Bash 脚本中,使用 set -x 调试脚本输出。尽可能使用严格模式。使用 set -e 在遇到错误时退出。也可以使用 set -o pipefail,对错误进行严格处理(虽然该话题有点微妙)。对于更复杂的脚本,也可以使用 trap。</p>
    </li>
    <li>
    <p>在 Bash 脚本中,子 shell(写在括号中的)是组合命令的便利的方式。一个常见的例子是临时移动到一个不同的工作目录,如:</p>
    <pre class="prettyprint ">  # 在当前目录做些事
      (cd /some/other/dir; other-command)
      # 继续回到原目录
    </pre>
    </li>
    <li>
    <p>注意,在 Bash 中有大量的各种各样的变量扩展。检查一个变量是否存在:${name:?error message}。例如,如果一个Bash脚本要求一个单一参数,只需写 input_file=${1:?usage: $0 input_file}。算术扩展:i=$(( (i + 1) % 5 ))。序列: {1..10}。修剪字符串:${var%suffix} 和 ${var#prefix}。例如,if var=foo.pdf ,那么 echo ${var%.pdf}.txt 会输出 foo.txt。</p>
    </li>
    <li>
    <p>命令的输出可以通过 <(some command) 作为一个文件来处理。例如,将本地的 /etc/hosts 和远程的比较:</p>
    <pre class="prettyprint ">  diff /etc/hosts <(ssh somehost cat /etc/hosts)
    </pre>
    </li>
    <li>
    <p>了解 Bash 中的&ldquo;嵌入文档&rdquo;,就像在 cat <<eof ... 中。</p>
    </li>
    <li>
    <p>在 Bash 中,通过:some-command >logfile 2>&1 同时重定向标准输出和标准错误。通常,要确保某个命令不再为标准输入打开文件句柄,而是将它捆绑到你所在的终端,添加 </dev/null 是个不错的做法。</p>
    </li>
    <li>
    <p>man ascii 可以得到一个不错的ASCII表,带有十六进制和十进制值两种格式。对于常规编码信息,man unicode,man utf-8 和 man latin1 将很有帮助。</p>
    </li>
    <li>
    <p>使用 screen 或 tmux 来复用屏幕,这对于远程 ssh 会话尤为有用,使用它们来分离并重连到会话。另一个只用于保持会话的最小可选方案是 dtach。</p>
    </li>
    <li>
    <p>在 ssh 中,知道如何使用 -L 或 -D(偶尔也用-R)来打开端口通道是很有用的,如从一台远程服务器访问网站时。</p>
    </li>
    <li>
    <p>为你的 ssh 配置进行优化很有用;例如,这个 ~/.ssh/config 包含了可以避免在特定网络环境中连接被断掉的情况的设置、使用压缩(这对于通过低带宽连接使用 scp 很有用),以及使用一个本地控制文件来开启到同一台服务器的多通道:</p>
    <pre class="prettyprint ">  TCPKeepAlive=yes
      ServerAliveInterval=15
      ServerAliveCountMax=6
      Compression=yes
      ControlMaster auto
      ControlPath /tmp/%r@%h:%p
      ControlPersist yes
    </pre>
    </li>
    <li>
    <p>其它一些与 ssh 相关的选项对会影响到安全,请小心开启,如各个子网或主机,或者在信任的网络中:StrictHostKeyChecking=no, ForwardAgent=yes</p>
    </li>
    <li>
    <p>要获得八进制格式的文件的权限,这对于系统配置很有用而用 ls 又没法查看,而且也很容易搞得一团糟,可以使用像这样的东西:</p>
    <pre class="prettyprint ">  stat -c '%A %a %n' /etc/timezone
    </pre>
    </li>
    <li>
    <p>对于从另一个命令的输出结果中交互选择值,可以使用<a href="https://github.com/mooz/percol">percol</a>。</p>
    </li>
    <li>
    <p>对于基于另一个命令(如git)输出的文件交互,可以使用fpp (<a href="https://github.com/facebook/PathPicker">路径选择器</a>)。</p>
    </li>
    <li>
    <p>要为当前目录(及子目录)中的所有文件构建一个简单的 Web 服务器,让网络中的任何人都可以获取,可以使用: python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)。</p>
    </li>
    </ul>
    <h2 id="toc_4">处理文件和数据</h2>
    <ul>
    <li>
    <p>要在当前目录中按名称定位文件,find . -iname '*something*'(或者相类似的)。要按名称查找任何地方的文件,使用 locate something(但请记住,updatedb 可能还没有索引最近创建的文件)。</p>
    </li>
    <li>
    <p>对于源代码或数据文件进行的常规搜索(要比 grep -r 更高级),使用 <a href="https://github.com/ggreer/the_silver_searcher">ag</a>。</p>
    </li>
    <li>
    <p>要将 HTML 转成文本:lynx -dump -stdin。</p>
    </li>
    <li>
    <p>对于 Markdown、HTML,以及各种类型的文档转换,可以试试 <a href="http://pandoc.org/">pandoc</a>。</p>
    </li>
    <li>
    <p>如果你必须处理 XML,xmlstarlet 虽然有点老旧,但是很好用。</p>
    </li>
    <li>
    <p>对于 JSON,使用jq。</p>
    </li>
    <li>
    <p>对于 Excel 或 CSV 文件,<a href="https://github.com/onyxfish/csvkit">csvkit</a> 提供了 in2csv,csvcut,csvjoin,csvgrep 等工具。</p>
    </li>
    <li>
    <p>对于亚马逊 S3 ,<a href="https://github.com/s3tools/s3cmd">s3cmd</a> 会很方便,而 <a href="https://github.com/bloomreach/s4cmd">s4cmd</a> 则更快速。亚马逊的 <a href="https://github.com/aws/aws-cli">aws</a> 则是其它 AWS 相关任务的必备。</p>
    </li>
    <li>
    <p>掌握 sort 和 uniq,包括 uniq 的 -u 和 -d 选项&mdash;&mdash;参见下面的单行程序。</p>
    </li>
    <li>
    <p>掌握 cut,paste 和 join,它们用于处理文本文件。很多人会使用 cut,但常常忘了 join。</p>
    </li>
    <li>
    <p>了解 tee,它会将 stdin 同时复制到一个文件和 stdout,如 ls -al | tee file.txt。</p>
    </li>
    <li>
    <p>知道 locale 会以微妙的方式对命令行工具产生大量的影响,包括排序的顺序(整理)以及性能。大多数安装好的 Linux 会设置 LANG 或其它 locale 环境变量为本地设置,比如像 US English。但是,你要明白,如果改变了本地环境,那么排序也将改变。而且 i18n 过程会让排序或其它命令的运行慢<em>好多倍</em>。在某些情形中(如像下面那样的设置操作或唯一性操作),你可以安全地整个忽略缓慢的 i18n 过程,然后使用传统的基于字节的排序顺序 export LC_ALL=C。</p>
    </li>
    <li>
    <p>了解基本的改动数据的 awk 和 sed 技能。例如,计算某个文本文件第三列所有数字的和:awk '{ x += $3 } END { print x }'。这可能比 Python 的同等操作要快3倍,而且要短3倍。</p>
    </li>
    <li>
    <p>在一个或多个文件中,替换所有出现在特定地方的某个字符串:</p>
    <pre class="prettyprint ">  perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
    </pre>
    </li>
    <li>
    <p>要立即根据某个模式对大量文件重命名,使用 rename。对于复杂的重命名,<a href="https://github.com/jlevy/repren">repren</a> 可以帮助你达成。</p>
    <pre class="prettyprint ">  # 恢复备份文件 foo.bak -> foo:
      rename 's/.bak$//' *.bak
      # 完整的文件名、目录名 foo -> bar:
      repren --full --preserve-case --from foo --to bar .
    </pre>
    </li>
    <li>
    <p>使用 shuf 来从某个文件中打乱或随机选择行。</p>
    </li>
    <li>
    <p>了解 sort 的选项。知道这些键是怎么工作的(-t和-k)。特别是,注意你需要写-k1,1来只通过第一个字段排序;-k1意味着根据整行排序。</p>
    </li>
    <li>
    <p>稳定排序(sort -s)会很有用。例如,要首先按字段2排序,然后再按字段1排序,你可以使用 sort -k1,1 | sort -s -k2,2</p>
    </li>
    <li>
    <p>如果你曾经需要在 Bash 命令行中写一个水平制表符(如,用于 -t 参数的排序),按<strong>ctrl-v</strong> <strong>[Tab]</strong>,或者写$'t'(后面的更好,因为你可以复制/粘贴)。</p>
    </li>
    <li>
    <p>对源代码进行补丁的标准工具是 diff 和 patch。 用 diffstat 来统计 diff 情况。注意 diff -r 可以用于整个目录,所以可以用 diff -r tree1 tree2 | diffstat 来统计(两个目录的)差异。</p>
    </li>
    <li>
    <p>对于二进制文件,使用 hd 进行简单十六进制转储,以及 bvi 用于二进制编辑。</p>
    </li>
    <li>
    <p>还是用于二进制文件,strings(加上 grep 等)可以让你找出一点文本。</p>
    </li>
    <li>
    <p>对于二进制文件的差异(delta 压缩),可以使用 xdelta3。</p>
    </li>
    <li>
    <p>要转换文本编码,试试 iconv 吧,或者对于更高级的用途使用 uconv;它支持一些高级的 Unicode 的东西。例如,这个命令可以转换为小写并移除所有重音符号(通过扩展和丢弃):</p>
    <pre class="prettyprint ">  uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
    </pre>
    </li>
    <li>
    <p>要将文件分割成几个部分,来看看 split(按大小分割)和 csplit(按格式分割)吧。</p>
    </li>
    <li>
    <p>使用 zless,zmore,zcat 和 zgrep 来操作压缩文件。</p>
    </li>
    </ul>
    <h2 id="toc_5">系统调试</h2>
    <ul>
    <li>
    <p>对于 Web 调试,<b1>curl</b1>和 <b1>curl -I</b1>很方便灵活,或者也可以使用它们的同行 <b1>wget

    ,或者更现代的

    1
    httpie

  • 要了解磁盘、CPU、网络的状态,使用

    1
    iostat

    1
    netstat

    1
    top

    (或更好的

    1
    htop

    )和(特别是)

    1
    dstat

    。它们对于快速获知系统中发生的状况很好用。

  • 对于更深层次的系统总览,可以使用

    1
    glances

    。它会在一个终端窗口中为你呈现几个系统层次的统计数据,对于快速检查各个子系统很有帮助。

  • 要了解内存状态,可以运行

    1
    free</b1>和 <b1>vmstat

    ,看懂它们的输出结果吧。特别是,要知道“cached”值是Linux内核为文件缓存所占有的内存,因此,要有效地统计“free”值。

  • Java 系统调试是一件截然不同的事,但是对于 Oracle 系统以及其它一些 JVM 而言,不过是一个简单的小把戏,你可以运行

    1
    kill -3 <pid>

    ,然后一个完整的堆栈追踪和内存堆的摘要(包括常规的垃圾收集细节,这很有用)将被转储到stderr/logs。

  • 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mtr</b1>作路由追踪更好,可以识别网络问题。</p>
    </li>
    <li>
    <p>对于查看磁盘满载的原因,<b1>ncdu</b1>会比常规命令如 <b1>du -sh *</b1>更节省时间。</p>
    </li>
    <li>
    <p>要查找占用带宽的套接字和进程,试试 <b1>iftop</b1>或 <b1>nethogs</b1>吧。</p>
    </li>
    <li>
    <p>(Apache附带的)<b1>ab

    工具对于临时应急检查网络服务器性能很有帮助。对于更复杂的负载测试,可以试试

    1
    siege

  • 对于更仔细的网络调试,可以用

    1
    wireshark

    1
    tshark</b1>或 <b1>ngrep

  • 掌握

    1
    strace</b1>和 <b1>ltrace

    。如果某个程序失败、挂起或崩溃,而你又不知道原因,或者如果你想要获得性能的大概信息,这些工具会很有帮助。注意,分析选项(

    1
    -c

    )和使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -p</b1>关联运行进程。</p>
    </li>
    <li>
    <p>掌握 <b1>ldd</b1>来查看共享库等。</p>
    </li>
    <li>
    <p>知道如何使用 <b1>gdb</b1>来连接到一个运行着的进程并获取其堆栈追踪信息。</p>
    </li>
    <li>
    <p>使用 <b1>/proc

    。当调试当前的问题时,它有时候出奇地有帮助。样例:

    1
    /proc/cpuinfo

    1
    /proc/xxx/cwd

    1
    /proc/xxx/exe

    1
    /proc/xxx/fd/

    1
    /proc/xxx/smaps

  • 当调试过去某个东西为何出错时,

    1
    2
    3
    4
    sar</b1>会非常有帮助。它显示了 CPU、内存、网络等的历史统计数据。</p>
    </li>
    <li>
    <p>对于更深层的系统和性能分析,看看 <b1>stap</b1>(<a href="https://sourceware.org/systemtap/wiki">SystemTap</a>),<a href="http://en.wikipedia.org/wiki/Perf_(Linux"><code>perf

    ) 和

    1
    sysdig

    吧。

  • 确认是正在使用的 Linux 发行版版本(支持大多数发行版):

    1
    lsb_release -a

  • 每当某个东西的行为异常时(可能是硬件或者驱动器问题),使用

    1
    dmesg

单行程序

这是将命令连成一行的一些样例:

  • 有时候通过 sort/uniq 对文本文件做交集、并集和差集运算时,这个例子会相当有帮助。假定 a 和 b 是已经进行了唯一性处理的文本文件。这会很快,而且可以处理任意大小的文件,总计可达数千兆字节。(Sort不受内存限制,不过如果 /tmp 放在一个很小的根分区的话,你可能需要使用 -T 选项。)也可参见上面关于LC_ALL的注解和 -u 选项(参见下面例子更清晰)。
    sh cat a b | sort | uniq > c # c 是 a 和 b 的并集
    cat a b | sort | uniq -d > c # c 是 a 和 b 的交集
    cat a b b | sort | uniq -u > c # c 是 a 减去 b 的差集
  • 使用 grep . * 来可视化查看一个目录中的所有文件的所有内容,例如,对于放满配置文件的目录: /sys, /proc, /etc。

  • 对某个文本文件的第三列中所有数据进行求和(该例子可能比同等功能的Python要快3倍,而且代码也少于其3倍):

      awk '{ x += $3 } END { print x }' myfile
    
  • 如果想要查看某个文件树的大小/日期,该例子就像一个递归ls -l,但是比ls -lR要更容易读懂:

      find . -type f -ls
    
  • 只要可以,请使用 xargs 或 parallel。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:

      find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
    
  • 比如说,你有一个文本文件,如 Web 服务器的日志,在某些行中出现了某个特定的值,如 URL 中出现的 acct_id 参数。如果你想要统计有多少个 acct_id 的请求:

    cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
    
  • 运行该函数来获得来自本文的随机提示(解析Markdown并从中提取某个项目):

    function taocl() {
        curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
          pandoc -f markdown -t html |
          xmlstarlet fo --html --dropdtd |
          xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
          xmlstarlet unesc | fmt -80
      }
    

晦涩难懂,但却有用

  • expr:实施算术或布林操作,或者求正则表达式的值

  • 1
    m4

    :简单的宏处理器

  • 1
    yes

    :大量打印一个字符串

  • 1
    cal

    :漂亮的日历

  • 1
    env

    :(以特定的环境变量设置)运行一个命令(脚本中很有用)

  • 1
    look

    :查找以某个字符串开头的英文单词(或文件中的行)

  • 1
    cut</b1>和 <b1>paste</b1>以及 <b1>join

    :数据处理

  • 1
    fmt

    :格式化文本段落

  • 1
    pr

    :格式化文本为页/列

  • 1
    fold

    :文本折行

  • 1
    column

    :格式化文本为列或表

  • 1
    expand</b1>和 <b1>unexpand

    :在制表符和空格间转换

  • 1
    nl

    :添加行号

  • 1
    seq

    :打印数字

  • 1
    bc

    :计算器

  • 1
    factor

    :分解质因子

  • 1
    gpg

    :加密并为文件签名

  • 1
    toe

    :terminfo 条目表

  • 1
    nc

    :网络调试和数据传输

  • 1
    socat

    :套接字中继和 tcp 端口转发(类似

    1
    netcat

  • 1
    slurm

    :网络流量可视化

  • 1
    dd

    :在文件或设备间移动数据

  • 1
    file

    :识别文件类型

  • 1
    tree

    :以树形显示目录及子目录;类似

    1
    ls

    ,但是是递归的。

  • 1
    stat

    :文件信息

  • 1
    tac

    :逆序打印文件

  • 1
    shuf

    :从文件中随机选择行

  • 1
    comm

    :逐行对比分类排序的文件

  • 1
    hd

    1
    bvi

    :转储或编辑二进制文件

  • 1
    strings

    :从二进制文件提取文本

  • 1
    tr

    :字符转译或处理

  • 1
    iconv

    1
    uconv

    :文本编码转换

  • 1
    split

    1
    csplit

    :分割文件

  • 1
    units

    :单位转换和计算;将每双周(fortnigh)一浪(浪,furlong,长度单位,约201米)转换为每瞬(blink)一缇(缇,twip,一种和屏幕无关的长度单位)(参见: /usr/share/units/definitions.units)(LCTT 译注:这都是神马单位啊!)

  • 1
    7z

    :高比率文件压缩

  • 1
    ldd

    :动态库信息

  • 1
    nm

    :目标文件的符号

  • 1
    ab

    :Web 服务器基准测试

  • 1
    strace

    :系统调用调试

  • 1
    mtr

    :用于网络调试的更好的路由追踪软件

  • 1
    cssh

    :可视化并发 shell

  • 1
    rsync

    :通过 SSH 同步文件和文件夹

  • 1
    wireshark</b1>和 <b1>tshark

    :抓包和网络调试

  • 1
    ngrep

    :从网络层摘取信息

  • 1
    host</b1>和 <b1>dig

    :DNS查询

  • 1
    lsof

    :处理文件描述符和套接字信息

  • 1
    dstat

    :有用的系统统计数据

  • 1
    glances

    :高级,多个子系统概览

  • 1
    iostat

    :CPU和磁盘使用率统计

  • 1
    htop

    :top的改进版

  • 1
    last

    :登录历史

  • 1
    w

    :谁登录进来了

  • 1
    id

    :用户/组身份信息

  • 1
    sar

    :历史系统统计数据

  • 1
    iftop

    1
    nethogs

    :按套接口或进程的网络使用率

  • 1
    ss

    :套接口统计数据

  • 1
    dmesg

    :启动和系统错误信息

  • 1
    hdparm

    :SATA/ATA 磁盘操作/改善性能

  • 1
    lsb_release

    :Linux 发行版信息

  • 1
    lsblk

    :列出块设备,以树形展示你的磁盘和分区

  • 1
    lshw

    :硬件信息

  • 1
    fortune

    1
    ddate</b1>和 <code>sl

    :嗯,好吧,它取决于你是否认为蒸汽机车和 Zippy 引用“有用”

更多资源

免责声明

除了非常小的任务外,其它都写出了代码供大家阅读。伴随力量而来的是责任。事实是,你在Bash中做的,并不意味着是你所应该做的!;)


via: https://github.com/jlevy/the-art-of-command-line

作者:jlevy 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5703-1.html

Linux:完全抛弃Windows

上个星期四,我成功的将Windows从硬盘上删除,并把Windows的ntfs分区合并到Linux的/root分区。 现在谈谈具体的过程: 一、用acronis的磁盘软件将C:,D:,E:合并成一个分区。 首先把扩展分区D:,E:合并成一个扩展分区D:。然后再把D:合并到主分区C:,这步需要重启,而且对于双系统来说重启时会进入grub>提示符的状态。所以由grub>提示符正确启动Windows这个小技巧就显得格外重要。依次打入如下命令来正常启动Windows: root (hd0,0) chainloader (hd0,0)+1 boot 然后acronis会自动完成剩余的分区合并操作。 注:这步会根据数据的多少而有所不同,我的机器实际操作时,用了43分钟。 二、由CD-Linux或Live-USB、Live-CD启动机器。 启动后,打开刚才合并好的唯一一个Windows分区。复制里面的重要文件来完成对Windows分区的备份。 三、打开Gparted(如果没有就先安装) 删除唯一的一个Windows分区。然后,调整Linux的/root分区使其占用刚才删除的所有Windows分区的空间。点“应用”来完成整个“完全抛弃Windows”计划。顺便提醒一下:Linux的所有分区必须卸载且swap分区关闭才能调整/root分区的大小。 注:这步也会根据数据的多少而有所不同,我的机器实际操作时,用了37分钟。 四、修复grub对Linux的引导(Live-CD或Live-USB环境下进行操作) #mount /dev/sda /mnt/system // 其中:/dev/sda为机器上的硬盘;/mnt/system为挂载点,可以为任意不重要的文件夹。 #mount -t proc none /mnt/system/proc #mount -o bind /dev /mnt/system/dev #chroot /mnt/system /bin/bash #grub grub>root (hd0,x)   //x为Linux所在的分区,如果不知道,可以从0开始试,哪个数没有错误提示就是哪个数。 grub>setup (hd0)  //如果只有一块硬盘就是hd0 grub>quit #vi /boot/grub/menu.lst  //修改menu.lst:改所有原来的路径为(hd0,x) #reboot //重启即可 最后,再鄙视一下Windows: Linux的Gparted只有1.1MB大小就可以独挡Linux分区这一面;而Windows的acronis必须有76MB才能独挡Windows分区这一面。真是差距啊,同是天底下的两个分区软件怎么差距就这么大呢?? [本话题由 breezegrowing 于 2010-03-29 22:25:36 编辑]

 

本文内容由 breezegrowing 提供

 

来源:https://linux.cn/article-5-1.html

Linux:给 man pages 设置颜色

Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。在windows中F1可能不经常用,但在linux中man命令可是比不可少的。

默认的man pages 只有一种颜色,有些文字是进行加粗的,习惯了vim的颜色高亮显示,man pages显得单调很多:

点击查看原始大图

方法比较简单:

打开/etc/bash.bashrc(需要root权限)或者~/.bashrc文件加入如下内容:

# Set colors for man pages
man() {
  env \
  LESS_TERMCAP_mb=$(printf "\e[1;31m") \
  LESS_TERMCAP_md=$(printf "\e[1;31m") \
  LESS_TERMCAP_me=$(printf "\e[0m") \
  LESS_TERMCAP_se=$(printf "\e[0m") \
  LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
  LESS_TERMCAP_ue=$(printf "\e[0m") \
  LESS_TERMCAP_us=$(printf "\e[1;32m") \
  man "$@"
}

重新打开终端,现在执行man就有颜色了。

该脚本其实定义了一个man函数,每次我们执行man的时候都是执行的该函数。如果执行原始的man运行/usr/bin/man 即可。

来自LinuxDeepin博客,并进行一定的修改。

来自:http://www.ubuntuhome.com/man-pages-set-color.html

 

 

Linux:10个工具让你的 shell 脚本更强大

很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。 

1. notify-send 命令

这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包: 

$ sudo apt-get install libnotify-bin

下面这个例子展示了如何从命令行向桌面发送一个简单的消息: 

notify-send "rsnapshot done :)" 

输出:  下面是一个复杂一点的例子: 

....
alert=18000
live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g')
[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i   "BSE Sensex touched 18k";  notify_counter=1; }
...

输出:  这里的参数解释如下: 

  •  -t 5000:指定超时的时间,毫秒
  •  -u low:设置是否紧急
  •  -i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png

2. tput 命令

这个命令是用来设置终端特性的: 

  •   移动光标
  •   获得终端信息
  •   设置前景和背景色
  •   设置粗体模式
  •   设置反模式等等

举例: 

#!/bin/bash

# clear the screen
tput clear

# Move cursor to screen location X,Y (top left is 0,0)
tput cup 3 15

# Set a foreground colour using ANSI escape
tput setaf 3
echo "XYX Corp LTD."
tput sgr0

tput cup 5 17
# Set reverse video mode
tput rev
echo "M A I N - M E N U"
tput sgr0

tput cup 7 15
echo "1. User Management"

tput cup 8 15
echo "2. Service Management"

tput cup 9 15
echo "3. Process Management"

tput cup 10 15
echo "4. Backup"

# Set bold mode
tput bold
tput cup 12 15
read -p "Enter your choice [1-4] " choice

tput clear
tput sgr0
tput rc

输出:  

3. setleds 命令 

这个命令可以让你控制键盘灯,例如打开数字键盘灯: 

setleds -D +num

关闭数字键盘灯: 

setleds -D -num
  •   -caps: 清除大写灯
  •   +caps:打开大写灯
  •   -scroll:清除滚动锁
  •   +scroll:打开滚动锁

4. zenity 命令

这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: 

#!/bin/bash
# Get domain name
_zenity="/usr/bin/zenity"
_out="/tmp/whois.output.$$"
domain=$(${_zenity} --title  "Enter domain" \
                --entry --text "Enter the domain you would like to see whois info" )

if [ $? -eq 0 ]
then
  # Display a progress dialog while searching whois database
  whois $domain  | tee >(${_zenity} --width=200 --height=100 \
                      --title="whois" --progress \
                        --pulsate --text="Searching domain info..." \
                                    --auto-kill --auto-close \
                                    --percentage=10) >${_out}

  # Display back output
  ${_zenity} --width=800 --height=600  \
         --title "Whois info for $domain" \
         --text-info --filename="${_out}"
else
  ${_zenity} --error \
         --text="No input provided"
fi

输出: Fig.04: zenity in Action 

5. kdialog 命令 

这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下: 

kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."

输出  你可以查看 shell scription with KDE Dialogs 来获取更多信息 

6. Dialog 

这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码: 

>#!/bin/bash
dialog --title "Delete file" \
--backtitle "Linux Shell Script Tutorial Example" \
--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60

# Get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [Esc] key.
response=$?
case $response in
   0) echo "File deleted.";;
   1) echo "File not deleted.";;
   255) echo "[ESC] key pressed.";;
esac

 

7. logger 命令 

这个命令可以让你写入系统日志例如 /var/log/messages: 

logger "MySQL database backup failed."
tail -f /var/log/messages
logger -t mysqld -p daemon.error "Database Server failed"
tail -f /var/log/syslog

输出: Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed 

8. setterm 命令 

这个命令可以设置中断的属性。下面的例子是强制屏幕全黑15分钟,并且60分钟后把显示器设为待机状态: 

setterm -blank 15 -powersave powerdown -powerdown 60

下面这段命令可以在中断显示加下划线的文字: 

setterm -underline on;
echo "Add Your Important Message Here"
setterm -underline off

或者你可以关闭光标: 

setterm -cursor off

9. smbclient:

向 MS-Windows 系统发送消息 smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: 

smbclient -M WinXPPro <

或者 

echo "${Message}" | smbclient -M salesguy2

10. Bash Socket 编程 

你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件: 

  •   /dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
  •   /dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。

  你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器: 

# find out if TCP port 25 open or not
(echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"

你可以 使用循环来查找开着的端口: 

echo "Scanning TCP ports..."
for p in {1..1023}
do
  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
done

输出: Scanning TCP ports... 22 open 53 open 80 open 139 open 445 open 631 open 下面的这个例子让你的脚本扮演HTTP客户端: 

#!/bin/bash
exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80

printf "GET / HTTP/1.0\r\n" >&3
printf "Accept: text/html, text/plain\r\n" >&3
printf "Accept-Language: en\r\n" >&3
printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}"   >&3
printf "\r\n" >&3

while read LINE <&3
do
   # do something on $LINE
   # or send $LINE to grep or awk for grabbing data
   # or simply display back data with echo command
   echo $LINE
done

关于GUITools和Cronjob 

如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user's machine]:0 ”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具: 

@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh

所有的命令你都可以通过“man”来查询详细的使用方式。 

VIA http://www.oschina.net/question/28_39527

Linux:History(历史)命令用法 15 例

如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率。本文将通过实例的方式向你介绍 history 命令的 15 个用法。

1、使用 HISTTIMEFORMAT 显示时间戳

当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身。如果你想要查看命令历史的时间戳,那么可以执行:

# export HISTTIMEFORMAT='%F %T '
# history | more
1  2008-08-05 19:02:39 service network restart
2  2008-08-05 19:02:39 exit
3  2008-08-05 19:02:39 id
4  2008-08-05 19:02:39 cat /etc/redhat-release

注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后,之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。[感谢 NightOwl 读者补充]

2、使用 Ctrl+R 搜索历史

Ctrl+R 是我经常使用的一个快捷键。此快捷键让你对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到命令后,通常再按回车键就可以执行该命令。如果想对找到的命令进行调整后再执行,则可以按一下左或右方向键。

# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt]
(reverse-i-search)`red‘: cat /etc/redhat-release
[Note: Press enter when you see your command, which will execute the command from the history]
# cat /etc/redhat-release
Fedora release 9 (Sulphur)

3、快速重复执行上一条命令

有 4 种方法可以重复执行上一条命令:

  1. 使用上方向键,并回车执行。
  2. 按 !! 并回车执行。
  3. 输入 !-1 并回车执行。
  4. 按 Ctrl+P 并回车执行。

4、从命令历史中执行一个指定的命令

在下面的例子中,如果你想重复执行第 4 条命令,那么可以执行 !4:

# history | more
1  service network restart
2  exit
3  id
4  cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)

5、通过指定关键字来执行以前的命令

在下面的例子,输入 !ps 并回车,将执行以 ps 打头的命令:

# !ps
ps aux | grep yp
root     16947  0.0  0.1  36516  1264 ?        Sl   13:10   0:00 ypbind
root     17503  0.0  0.0   4124   740 pts/0    S+   19:19   0:00 grep yp

6、使用 HISTSIZE 控制历史命令记录的总行数

将下面两行内容追加到 .bash_profile 文件并重新登录 bash shell,命令历史的记录数将变成 450 条:

# vi ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450

7、使用 HISTFILE 更改历史文件名称

默认情况下,命令历史存储在 ~/.bashhistory 文件中。添加下列内容到 .bashprofile 文件并重新登录 bash shell,将使用 .commandline_warrior 来存储命令历史:

# vi ~/.bash_profile
HISTFILE=/root/.commandline_warrior

8、使用 HISTCONTROL 从命令历史中剔除连续重复的条目

在下面的例子中,pwd 命令被连续执行了三次。执行 history 后你会看到三条重复的条目。要剔除这些重复的条目,你可以将 HISTCONTROL 设置为 ignoredups:

# pwd
# pwd
# pwd
# history | tail -4
44  pwd
45  pwd
46  pwd [Note that there are three pwd commands in history, after executing pwd 3 times as shown above]
47  history | tail -4
# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56  export HISTCONTROL=ignoredups
57  pwd [Note that there is only one pwd command in the history, even after executing pwd 3 times as shown above]
58  history | tail -4