12.26 Linux 命令行黑技术(LTS)

Linux命令行,是开发人员日常接触的东西。但是,有很多小技巧。我在这里做个总结(长期更新)。

Linux 命令行黑技术(LTS)


在路径间如鱼得水

黑技术1:设立根目录

如果,你经常使用一个目录作为你的根目录,那么,你可以通过CDPATH来指定你的cd根目录。 例如,我经常到/etc目录下,来対相应的文件进行配置。比如我想从我的家目录到/etc/nginx/目录下,一般的方法是:

<code>cd /etc/nginx/ 
复制代码/<code>

有没有可以偷懒的法子呢?当然有,我们可以在.bashrc(如果你是zsh的话,就在.zshrc下)加入export CDPATH=/etc 现在,你想打开的/etc/nginx/目录下,只需要输入:

<code>cd nginx
复制代码/<code>

懒人必备。 当然,你可以输入多个根路径,只要在每个路径下用:隔开。

<code>export CDPATH=.:~:/etc:/var:
复制代码/<code>

黑技术2:在两个路径相互切换

当我们经常需要在一个terminal下,在两个路径之间,来回切换。这个时候,我们可以使用cd -,在两个路径之间“反复横跳”。


Linux 命令行黑技术(LTS)


例如:第一个路径是/etc/nginx/,第二个路径是~/project/,我们先cd /etc/nginx/下,然后,再cd ~/project/。随后,当我们需要切换另一个路径只需要cd -就可以实现。

黑技术3:将路径通过栈的方式访问

如果,遇到访问路径的过程像栈这种数据结构,那么我们可以用pushd来解决。 实现过程:

  1. 导航到相应的目录例如/tmp/push1
  2. 使用pushd命令压入目录栈
  3. 在其他路径下,使用popd命令,导航到栈顶目录。

例子:

在/tmp/目录下创建来push1,push2,push3三个目录,需求是将这三个目录分别压入目录栈,然后分别导航到相应的目录。下面将显示整个过程:

<code># pcdack @ pcdack-sword in /tmp/push1 [18:58:01] 
$ pwd
/tmp/push1

# pcdack @ pcdack-sword in /tmp/push1 [18:58:15]
$ pushd .
/tmp/push1 /tmp ~

# pcdack @ pcdack-sword in /tmp/push1 [18:58:22]
$ cd /tmp/push2

# pcdack @ pcdack-sword in /tmp/push2 [18:58:31]
$ pushd .
/tmp/push2 /tmp/push1 /tmp ~

# pcdack @ pcdack-sword in /tmp/push2 [18:58:37]
$ cd /tmp/push3

# pcdack @ pcdack-sword in /tmp/push3 [19:00:23]
$ pushd .
/tmp/push3 /tmp/push2 /tmp/push1 /tmp ~

# pcdack @ pcdack-sword in /tmp/push3 [19:00:28]
$ popd
/tmp/push2 /tmp/push1 /tmp ~

# pcdack @ pcdack-sword in /tmp/push2 [19:00:37]
$ popd
/tmp/push1 /tmp ~
复制代码/<code>

整个过程非常简单,相信大家都能看得懂。

脚本:

当然我们可以将导航与压栈操作结合起来,我们可以将下面的代码写到.bashrc或者.zshrc下来实现。

<code>function pushcd(){
cd "$@" && eval pushd .;
}
复制代码/<code>

然后,压栈和切换路径一个命令解决。

黑技术4:“优雅”的切换上级目录

如果我们身处一个特别深的目录下,例如:/dev/bus/usb/001。那么,我们如何切换到/dev/bus/目录下咧?一般的做法是cd ../..,这里只有两级目录看似还是可以接受的,但是,如果,有一天,要回退五级目录。那么一般的写法就不优雅了。所以,在这里要介绍一个黑技术。使用alias来解决问题。在我们的.bashrc或者.zshrc下输入:

<code>alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."
复制代码/<code>

然后,我们回退两级目录将变成..2,优雅,快乐,美丽。 当然,也可以用其他表示方法:例如:cd1,cd2...

黑技术5:mkdir与cd的结合

在日常的开发中,我们经常需要创建一个文件夹,并且,导航到这个目录。但是,为了优(tou)雅(lan)。我们可以把两个命令和在一起。创建一个新的命令mkdircd。把下面的代码添加到.bashrc或者.zshrc下:

<code>function mkdircd(){
mkdir -p "$@" && eval cd "\"\\$$#\"";
}
复制代码/<code>

这样就OK了。

原来你是这样的剪切板

我们经常在terminal中,使用系统剪切板。比如,将一个命令的输出复制到剪切板,然后,粘贴到浏览器或其他地方等等的用途。首先,我们需要一个软件叫xsel。在各大发行版本中的包管理中都有,比如在arch中pacman -S xsel就可以安装了。

使用

1.将命令输出到剪切板,比如,我想将ls的结果复制到剪切板中,那么输入下面的命令就可以了:

<code>ls | xsel -i -b
复制代码/<code>

为了更加方便调用,我们可以.zshrc或者.bashrc填入如下代码:

<code>alias to_clipboard="sel -i -b"
复制代码/<code>

那么,刚刚的例子就变成了:

<code>ls | to_clipboard
复制代码/<code>

当然,我们也可以集成查看剪切板内容的命令,在.zshrc或是.bashrc中添加:

<code>alias clipboard="xsel -b -o"
复制代码/<code>

当我们在terminal中输入clipboard时,就会将剪切板的内容输出。

压缩文件自如操作

黑技术1:万能解压命令

在Linux中,压缩的格式有很多种类,例如,常用的有.tar.gz,zip,tar.bz2等等。解压命令“又臭又长”,那么,我们能不能一个命令就可以把所有的压缩格式的文件解压出来咧?当然是可以的,我们只需要将下面脚本添加到.zshrc或者.bashrc里,就可以做到一个命令解压所有:

注意:你的机器里需要预先安装了unrar,unzip命令

<code>ex ()
{
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via ex()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
复制代码/<code>

黑技术2:头文字“Z”

有些时候,我们需要直接查看压缩包里的内容,而不需要解压这个压缩包,那么我们可以使用z字头命令。这个系列一共有:

  1. zgrep
  2. zcat
  3. zless
  4. zmore
  5. zdiff 这些命令其实和不带"z"的功能类似,只不过作用的对象不一样。"z"命令是专门用在压缩文件下的。 例子:
<code>#我先创建几个文本文件
echo "this first line">first
gzip first
# 我们通过调用z命令来查看内容
zcat first.gz
# 当然同理我们可以通过zless,zmore来查看
# zgrep需要查找的字符用\\-i参数指定,比如我想查找带有`line`字眼的内容:
zgrep -i line first.gz
# zdiff用来对比两个归档文件的不同,与diff类似
# 我们首先创建一个新的文本
echo "this second line">second
gzip second
# 然后进行对比
zdiff first.gz second.gz
复制代码/<code>

”智慧“的Grep命令

黑技术:使grep具有与,或,非的逻辑

grep是我们经常使用的文本搜索工具。那么,我们如何使我们的grep具有与,或,非搜索条件? 在介绍使用之前,我们先显示我们要处理的数据(employee文件)

<code>100 张三 CEO 薪水 100k
101 李四 android工程师 薪水 10k
102 王五 IOS工程师 薪水 10k
103 刘六 Web工程师 薪水 20k
104 冯七 大数据工程师 薪水 25k

复制代码/<code>

grep并没有直接的”与“命令,需要我们使用正则表达式来模拟与命令

<code>grep -E "字符1.*字符2" filename
grep -E "字符1.*字符2|字符2.*字符1" filename
复制代码/<code>

我们要匹配要姓张,并且是CEO两个条件。那么,我们输入的命令是:

<code>grep -E "张.*CEO" employee
复制代码/<code>

我们要找文档中姓李与姓张的人: 方法1:

<code>grep '字符1\\|字符2' filename
复制代码/<code>
<code>grep '张\\|李' employee
复制代码/<code>

方法2:

<code>grep -E '字符1|字符2' employee
复制代码/<code>
<code>grep -E '张|李' employee
复制代码/<code>

除去所有姓李的人

<code>grep -v '字符1' employee
复制代码/<code>
<code>grep -v '李' employee
复制代码/<code>

回到过去的时光机


Linux 命令行黑技术(LTS)


黑技术1:灵活的Ctrl+R

日常开发工作的时候,我们经常遇到需要输入大量类似的,重复的命令。那么,我们能不能有一种方式可以根据几个字母,找到以前输入命令。方法当然是有的,就是Ctrl+R快捷键。

这里通过例子来展示一下,如何使用Ctrl+R。 首先,使用history | tail -4来看下我们要用到的后四条历史记录:

<code>1476  cd document
1477 ls
1478 service httpd stop
1479 cd /dev/cpu/
复制代码/<code>

情景一:重复历史命令

如果,我想重新执行cd document命令,那么,我需要轻敲键盘上的Ctrl+R键,然后,输入cd就可以看到命令行自动将cd document填入到终端提示符后。这个时候只要轻敲回车,那么,就可以复现命令。

<code># 按Ctrl+R键,然后,输入cd
$bck-i-search:cd
# 下面为命令行自动补全的命令
$cd document
复制代码/<code>

情景二:在历史命令的基础上更改参数

这个步骤与场景一类似,当我们找到我们需要更改的命令,然后,按左键或者右键,退出搜索模式,导航到我们需要修改的参数后,使用Ctrl+w删除整个参数,修改即可。下面我用一个例子来解释。这个例子是将1478 service httpd stop的stop参数改为start。

<code># 按Ctrl+R 

$bck-i-search:service
# 找到相应的命令,然后按左,右导航键,退出搜索模式
$ service httpd stop
# 然后我们按Ctrl-e到我们需要修改的stop参数后
$ service httpd stop
# 使用Ctrl+w删除参数
$ service httpd
# 补成我们需要的参数
$ service httpd start
复制代码/<code>

黑技术2:history 你不知道的事

让 history 显示时间戳

通过export HISTTIMEFORMAT='%F %T就可以让history显示时间戳。当然,你可以把这句话写到你的.bashrc里去,变成全局配置。下面展示一下效果吧。

<code>export HISTTIMEFORMAT='%F %T '
history | more
...
11 2018-04-19 12:54:15 zip STM32+HTTP/
12 2018-04-19 12:54:15 zip STM32+HTTP.zip STM32+HTTP/
13 2018-04-19 12:54:15 ;s
14 2018-04-19 12:54:15 man zip
15 2018-04-19 12:54:15 zip -r STMHTTP STM32+HTTP/
16 2018-04-19 12:54:15 ls
17 2018-04-19 12:54:15 mnt_entertain
18 2018-04-19 12:54:15 cd_entertainment
...
复制代码/<code>

注意不支持zsh,zsh的相关命令是HIS_STAMPS=dd-mm-yyyy

!回到过去的时光机

使用!的步骤:

  1. 通过history找到命令的序号,也就是history命令输出前面的数字。
  2. 通过!前面得到的数字,然后,回车。就会将相应序号后面的命令补全到终端提示符后。

例子:

<code>$history | head 
10 2018-04-19 12:54:15 ls
11 2018-04-19 12:54:15 zip STM32+HTTP/
12 2018-04-19 12:54:15 zip STM32+HTTP.zip STM32+HTTP/
13 2018-04-19 12:54:15 ;s
14 2018-04-19 12:54:15 man zip
15 2018-04-19 12:54:15 zip -r STMHTTP STM32+HTTP/
16 2018-04-19 12:54:15 ls
17 2018-04-19 12:54:15 mnt_entertain
18 2018-04-19 12:54:15 cd_entertainment
19 2018-04-19 12:54:15 ls
# 如果我想重复第17号命令,在终端提示符输入!17然后按回车
$!17
$mnt_entertain
复制代码/<code>

去掉历史记录中重复的命令

export HISTCONTROL=ignoredups命令,就可以去除该命令以后的history记录中的重复命令。这句话好像有点绕,下面我用例子来表示:

<code>$export HISTCONTROL=ignoredups
$pwd
$pwd
$pwd
$history | tail -3

...
1111 pwd
...
复制代码/<code>

正如上例所示,我们输入的3个pwd命令,最后,只剩下一个pwd命令,在我们的历史记录里面。

将历史命令的参数作为新命令的参数

场景一:当两个命令相邻时


Linux 命令行黑技术(LTS)

标题十分绕口。这里直接上例子(注意#后面的是我对下面的命令做的解释):


<code># 这里我们使用cp命令来复制一个名为text的文件
$cp text text.bak
# 我们想通过vim来编辑text.bak,只需要输入vim !^
$vim !^
#下面这条命令是当我们输入完上一条命令后,回车自动填充的内容
$ vim text.bak
# 我们想通过vim来编辑text,只需要输入vim !!:$
$vim !!:$
#下面这条命令是当我们输入完上一条命令后,回车自动填充的内容
$ vim text
复制代码/<code>
如果有多个参数

这里假设有如下命令command1 arg1 arg2 arg3 arg4,我们需要在command2中使用command1一中的arg2参数,那么我们如何用一种优雅的方式取到arg2参数?我们可以通过!!:2的方式取到,同理,如果,我们需要arg3参数,那么可以通过!!:3,依次类推。

<code>$command1 arg1 arg2 arg3 arg4
$command2 !!:2
#下面这条命令是当我们输入完上一条命令后,回车自动填充的内容
$command2 arg2

$command2 !!:3
#下面这条命令是当我们输入完上一条命令后,回车自动填充的内容
$command2 arg3
复制代码/<code>

场景二:当两个命令不相邻

如果,两个命令不相邻,当然也是有方法的。直接用例子来解释吧。

<code>$history|tail -3
...
command1 arg1 arg2 arg3 arg4
...
#我们的命令command2需要参数arg2
$command2 !command1:2
#下面这条命令是当我们输入完上一条命令后,回车自动填充的内容
#command2 arg2
复制代码/<code>

wget强大的下载工具


Linux 命令行黑技术(LTS)


黑技术1:下载限速

下载限速,主要是用在多个任务环境。因为,我们常常需要在下载的同时做一些其他的事情。例如,浏览网页。但是,wget命令默认开启全速下载,这个时候,可能影响到我们其他的任务。所以,需要让wget慢一点。wget通过--limit-rate来限制速度,举个例子:

<code># 使用wget下载。并且,限制速度不超过200k。
wget --limit-rate=200k http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
复制代码/<code>

黑技术2:后台下载:

正(kai)常(che)的后台下载。

<code>wget -b http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
复制代码/<code>

黑技术3:模拟浏览器请求

有些下载链接必须要通过浏览器下载,我们可以通过一些设置,让wget的下载请求,像浏览器一般:

<code># URL-TO-DOWNLOAD是下载链接
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0" URL-TO-DOWNLOAD
复制代码/<code>

黑技术4:试探下载链接是否可以下载

我们有些时候需要知道这个链接是否可以下载,然后,対不同的情况作出判断。

<code>wget --spider http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
复制代码/<code>

如果出现类似于下面的情况(最后以后显示存在远程文件),那么证明可以下载:

<code>打开 Spider 模式。检查是否存在远程文件。
--2018-04-20 22:51:42-- http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86-fulldocs.tar.gz
正在解析主机 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1
正在连接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:5162656 (4.9M) [application/octet-stream]
存在远程文件
复制代码/<code>

黑技术5:超过一定大小的文件退出下载

下载文件超过5MB,自动退出下载。

<code>wget -Q5m 下载链接
复制代码/<code>

文件列表“进化”

黑技术1:根据文件大小从大到小(从小到大)显示文件

当前文件夹下从大到小排列

<code> find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n -r
复制代码/<code>

我们可以把上面的命令使用alias写入我们的.bashrc和.zshrc,命名为ls_big:

<code>alias ls_big="find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n -r"
复制代码/<code>

当前文件夹下从小到大排列

<code>find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n
复制代码/<code>

与上面一样,我们可以写道配置文件里

<code>alias ls_small="find . -maxdepth 1 -type f -exec ls -s {} \\; | sort -n"
复制代码/<code>

黑技术2:根据文件的时间戳显示文件

这个需求,我们只需要使用ls -lt命令就可以来,当然,如果想要逆序输出ls -ltr

黑技术3:查看当前文件所有的隐藏文件和文件夹

文件

<code>find . -maxdepth 1 -type f -name ".*"
复制代码/<code>

我们可以写到配置文件中:

<code>alias ls_file_hide="find .-maxdepth -type f -name ".*""
复制代码/<code>

文件夹

<code>find . -maxdepth 1 -type d -name ".*"
复制代码/<code>

同理:

<code>alias ls_file_hide="find .-maxdepth -type d -name ".*""/<code>

另外还有一些关于c++ Linux后台服务器开发的一些知识点分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,协程,DPDK,webrtc,音视频等等视频。

喜欢的朋友可以后台私信【1】获取学习视频

附上一份c++ Linux后台服务器开发 学习课程大纲给大家


Linux 命令行黑技术(LTS)



分享到:


相關文章: