在 github 上面有一个 700 多人 star 的 repo 叫做 Bash-Oneliner,介绍了很多实用并且可以有效提高工作效率的命令,我们来了解一下。原文直达:
Bash-Oneliner
。注:去除了部分看上去没啥用的命令,可以原文查看所有内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Ctrl + n : 类似向下方向键 Ctrl + p : 类似向上方向键 Ctrl + r : 反向搜索 terminal 的历史命令 Ctrl + s : 停止该 terminal Ctrl + q : 在 Ctrl + s 后面重新恢复该 terminal Ctrl + a : 移动光标到行的开始处。(这个很有用) Ctrl + e : 移动光标到行的结尾处。(同上) Ctrl + d : 如果当前的 terminal 的命令行有输入,那么 Ctrl + d 会删除光标处的数字。否则会退出当前的 terminal Ctrl + k : 删除从当前光标开始到结尾的所有的字符 Ctrl + x + backspace: 删除从当前光标到行开始的所有的字符 Ctrl + t : 交换当前光标下的字符和其前面的字符的位置。Esc + t 交换光标前面的两个单词。(这个很有意思) Ctrl + w : 剪切光标之前的单词。Ctrl + y 粘贴该单词 Ctrl + u : 剪切光标之前的所有字符。Ctrl + y 粘贴刚刚剪切的字符 Ctrl + _ : 撤销前面的操作。(可以连续操作多次) Ctrl + l : 类似 clear。(类似 Mac 终端下的 Command + k) Ctrl + x + Ctrl + e : 唤起 $EDITOR 环境变量设置的编辑器程序,在需要输入多行的情况下比较有用。(试验了一下如果之前没有设置,$EDITOR 的默认值是 emacs。你可以将其设置为 vim,即 export EDITOR=vim。当然也可以将这个环境变量设置为其他的应用程序去实现一些有趣的功能,这个测试过了)
1 2 3
Esc + u : 将当前光标开始到单词结尾的字符都转换成大写。(这里的单词指的是光标所在的位置前后以空格分隔形成的单词) Esc + l : 将当前光标开始到单词结尾的字符都转换成小写 Esc + c : 将光标所在位置的字符转换成大写
1 2
!53 : 执行 history 中的 53 号命令 !! : 执行上一条命令
1 2 3 4 5 6 7 8
# 上一条命令:echo 'aaa' ^aaa^bbb # 此时将上一条命令替换为 echo 'bbb',输出 bbb # 需要注意的是,这样只会替换第一次 aaa,如果要替换所有的 aaa,需要像下面这样使用 ^aaa^bbb^:& # 或者 !!:gs/aaa/bbb/
1 2 3 4
!cat # 或者 !c # 执行历史命令中最近一条满足前缀是 c 或者 cat 的命令
1 2 3 4 5 6 7 8 9 10 11
# ? 表示一个单独的任意字符 /b?n/?at # 匹配上 /bin/cat # * 表示多个任意字符 /etc/pa*wd # 匹配上 /etc/passwd # '[]' 表示一个字符范围 ls -al [a-z]* # 列出所有以字母开头的文件 # '{}' 文件名匹配多种模式 ls {*.sh,*.py} # 列出所有的 .sh 和 .py 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$0, $1, $2, $3, ... : 在执行 shell 的时候传参使用,$0 表示 shell 名字,$1,$2,$3依次表示后面的参数 $# : 参数的个数 $? : 最近的一个终端 foreground 命令的退出状态 $- : 当前 shell 设置的选项,可以通过 echo $- 查看 $$ : 当前 shell 进程的 pid $! : 最近的一个终端后台命令的 pid $DESKTOP_SESSION : 当前的展示管理器。(可能说的是 xWindow) $EDITOR : 编辑器,可以通过上面提到的快捷键唤醒 $LANG : 语言设置 $PATH : 这个不用说了 $PWD : 当前目录 $SHELL : 当前的 shell $USER : 当前的 username $HOSTNAME : 当前的 hostname
1 2 3 4 5
grep = grep -G # 支持基本的正则表达式 fgrep = grep -F # 查找文件里符合条件的字符串 egrep = grep -E # 支持扩展的正则表达式 pgrep = grep -P # 兼容 Perl 的正则表达式语法 rgrep = grep -r # 递归 grep
1 2 3
grep -o '[0-9]*' #或者 grep -oP '\d'
1 2 3 4 5
grep ‘[0-9]\{3\}’ # or grep -E ‘[0-9]{3}’ # or grep -P ‘\d{3}’
1 2 3
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' # or grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
1 2 3 4 5 6 7 8
grep -A 3 'bbo' grep -B 3 'bbo' grep -C 3 'bbo'
1
grep -o -P '(?<=w1).*(?=w2)'
1 2
bbo="some strings" grep "$boo " filename
1
grep -o bbo filename |wc -l
1
grep --color bbo filename
1 2 3
grep -R bbo /path/to/directory grep -r bbo /path/to/directory
1
grep -rh bbo /path/to/directory
1
grep -rl bbo /path/to/directory
1 2 3 4
$echo "$long_str " |grep -q "$short_str " if [ $? -eq 0 ]; then echo 'found' ; fi
1
grep -d skip 'bbo' /path/to/files/*
1 2 3 4
sed -E '/^.{5}[^2]/d'
1 2
sed -i "/bbo/d" filename
1 2 3 4 5
sed '/^\s*$/d' sed '/^$/d'
1
sed -i '$ s/.$//' filename
1
sed -e '1isomething' -e '3isomething'
1
sed -e 's/$/\}\]/' filename
1
sed -s '$a,' *.json > all.json
1
sed "s/aaa=.*/aaa=\/my\/new\/path/g"
1 2 3
sed -n '0~3p' filename
1 2 3 4 5
sed "s/$/\t$i /" for i in $(ls);do sed -i "s/$/\t$i /" $i ;done
1
sed -r -e 's/^.{3}/&#/' file
1 2
a=bbo;b=obb; awk -v a="$a " -v b="$b " "$1 ==a && $10 =b" filename
1
awk '{print NR,length($0);}' filename
1
awk -v N=7 '{print}/bbo/&& --N<=0 {exit}'
1
ls|xargs -n1 -I file awk '{s=$0};END{print FILENAME,s}' file
1
awk 'BEGIN{OFS="\t"}$3="chr"$3'
1 2 3 4 5 6 7 8 9 10 11 12 13 14
awk 'print FILENAME, NR,FNR,$0}' fileA fileB
1 2 3
echo 1 2 3 4 5 6| xargs -n 3
1 2 3
$ echo a b c |xargs -p -n 3 $ echo a b c ?... $ a b c
1
find . -name "*.html" |xargs rm
1
find . -name "*.c" -print0|xargs -0 rm -rf
1 2 3 4 5 6
find . -name "*.bak" -print 0|xargs -0 -I {} mv {} ~/old find . -name "*.bak" -print 0|xargs -0 -I file mv file ~/old ls |head -100|xargs -I {} mv {} d1
1 2 3 4
time echo {1..5} |xargs -n 1 -P 5 sleep time echo {1..5} |xargs -n1 sleep
1 2 3 4
find /dir/to/A -type f -name "*.py" -print 0| xargs -0 -r -I file cp -v -p file --target-directory=/path/to/B
1
ls |xargs -n1 -I file sed -i '/^Pos/d' filename
1
ls |sed 's/.txt//g' |xargs -n1 -I file sed -i -e '1 i\>file\' file.txt
1
cat grep_list |xargs -I{} grep {} filename
1
grep -rl '192.168.1.111' /etc | xargs sed -i 's/192.168.1.111/192.168.2.111/g'
1 2 3 4 5
find . -name '*.php' -exec sed -i 's/www/w/g' {} \; replace "www" "w" -- *
1 2 3
find . -name "*.mso" -size -74c -delete