Linux 命令行黑技术(LTS)

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


image

在路径间如鱼得水

黑技术1:设立根目录

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

cd /etc/nginx/ 

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

cd nginx

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

export CDPATH=.:~:/etc:/var:

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

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

image

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

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

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

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

例子:

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

# 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 ~

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

脚本:

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

function pushcd(){
    cd "$@" && eval pushd .;
}

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

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

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

alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."

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

黑技术5:mkdir与cd的结合

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

function mkdircd(){
    mkdir -p "$@" && eval cd "\"\$$#\"";
}

这样就OK了。

原来你是这样的剪切板

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

使用

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

ls | xsel -i -b

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

alias to_clipboard="sel -i -b"

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

ls | to_clipboard

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

alias clipboard="xsel -b -o"

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

压缩文件自如操作

黑技术1:万能解压命令

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

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

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
}

黑技术2:头文字“Z”

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

  1. zgrep
  2. zcat
  3. zless
  4. zmore
  5. zdiff
    这些命令其实和不带"z"的功能类似,只不过作用的对象不一样。"z"命令是专门用在压缩文件下的。
    例子:
#我先创建几个文本文件
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

”智慧“的Grep命令

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

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

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

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

grep -E "字符1.*字符2" filename
grep -E "字符1.*字符2|字符2.*字符1" filename

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

grep -E "张.*CEO" employee

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

grep '字符1\|字符2' filename
grep '张\|李' employee

方法2:

grep -E '字符1|字符2' employee
grep -E '张|李' employee

除去所有姓李的人

grep -v '字符1' employee
grep -v '李' employee

(未完待续)

你可能感兴趣的:(Linux 命令行黑技术(LTS))