Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

让敲Shell命令高效起来

在刚上班的时刻,做过程序的部署工作,后面尽管工作中直接接触的机会很少。 但是一直对shell很敬(很牛)畏(太强太多),第一使用起来确实不是看几本书就能用好的,需要经常持久的使用,第二嘛命令太多个不用一段时间基本就忘记了。

来到新公司后,主要是后台代码的开发。尽管和部署挂不上什么关系,但再次遇到总有个想头-原来使用过去查查,算是自己使用linux过程中的一点总结。

记住历史,温故而知新

如果说是新人,可以通过历史学习前辈使用的命令。 作为维护人员,可以记录操作的命令,修改原有命令的部分再执行。

命令 解释
history
!! 执行上一条命令
!blah 执行最近的以 blah 开头的命令,如 !ls
!blah:p 仅打印输出,而不执行
!$ 上一条命令的最后一个参数,与 Alt + . 相同
!$:p 打印输出 !$ 的内容
!* 上一条命令的所有参数
!*:p 打印输出 !* 的内容
^blah 删除上一条命令中的 blah
^blah^foo 将上一条命令中的 blah 替换为 foo
^blah^foo^ 将上一条命令中所有的 blah 都替换为 foo
fc 打开编辑器(vim)编辑上一条命令
fc 123 编辑命令历史中编号为123的命令
fc 123 130 编辑命令历史中123-130的八条命令,退出后依次执行
fc ls 编辑最后一条以ls开头的命令
fc -s ls=cat ls 将最后一条以ls开头的命令中的ls替换成cat,然后执行
1
2
mkdir mmm
cd $*

参考 bash命令行历史的用法

快捷键

快捷方式

当遇到一串很长的路径时,如果每次都输入,尽管有Tab的辅助,但也不是一件烦心的事情。 这时,我们可以根据增加快捷方式/重定位为我们的工作提高效率,减少重复无谓的工作。

alias datanodelog="less ~/hadoop/logs/hadoop-Winseliu-datanode-WINSE.log"
alias jobtrackerlog="less ~/hadoop/logs/hadoop-Winseliu-jobtracker-WINSE.log"
alias tasktrackerlog="less ~/hadoop/logs/hadoop-Winseliu-tasktracker-WINSE.log"

ln -s /cygdrive/d/groovy-1.8.4/ groovylink

当你去看linux的bash脚本时,你会发现发现ll的命令其实是ls -l的alias的别名而已。 在工作中如果发现很多类似重复的操作,赶紧的把alias用起来的吧!

快速定位

快捷 解释
编辑命令
Ctrl + a 移到命令行首
Ctrl + e 移到命令行尾
Ctrl + f 按字符前移(右向)
Ctrl + b 按字符后移(左向)
Alt + f 按单词前移(右向)
Alt + b 按单词后移(左向)
Ctrl + xx 在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Ctrl + w 从光标处删除至字首
Alt + d 从光标处删除至字尾
Ctrl + d 删除光标处的字符
Ctrl + h 删除光标前的字符
Ctrl + y 粘贴至光标后
Alt + c 从光标处更改为首字母大写的单词
Alt + u 从光标处更改为全部大写的单词
Alt + l 从光标处更改为全部小写的单词
Ctrl + t 交换光标处和之前的字符
Alt + t 交换光标处和之前的单词
Alt + Backspace 与 Ctrl + w 相同类似,分隔符有些差别
重新执行命令
Ctrl + r 逆向搜索命令历史
Ctrl + g 从历史搜索模式退出
Ctrl + p 历史中的上一条命令,感觉不用那么麻烦吧,直接方向键就行了啊!
控制命令
Ctrl + l 清屏
Ctrl + o 执行当前命令,并选择上一条命令
Ctrl + s 阻止屏幕输出
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令

参考 Bash快捷键,让命令更有效率

使用趁手的工具

看到同事使用WinScp定位到目录上传文件,然后使用Putty进行命令操作,那个辛苦啊,甚是麻烦! SSH Secure Shell则集成了Putty和WinScp的功能。 更甚者还是用Xmanger的图形化界面: Windows连接Linux的常用工具Windows下如何远程连接 Linux

推荐我最爱的SSH工具: SecureCRT

SecureCRT不但能满足shell命令,能保存基本上全部的操作过程(Putty操作则和Linux上的终端效果一样)。

  • 选择复制,右键粘贴的功能也相当高效。
  • 基于zmoden的lrzsz命令能实现文件的上传和下载功能。
  • 记住密码这功能不在话下。
  • 克隆到新窗口中,实现多视图同时编辑。
1
2
alias rz="rz -e"
 

看到网上说的Xshell功能和SecureCRT类似,还支持颜色,并且是开源的没有版权问题!。Xshell讨论

配合screen命令更好用: https://www.ibm.com/developerworks/cn/linux/l-cn-screen/index.html

一些点

  • /etc/profile.d/jdk.sh

使用具体案例

  1. 批量改名加后缀:
1
ls -1 | xargs -i mv {}{,.old}

还原:

1
$ ls -1 | while read line ; do mv "$line" "${line%.*}" ; done
  1. 花括号展开

可能最奇怪的展开是花括号展开。通过它,你可以从一个包含花括号的模式中 创建多个文本字符串。这是一个例子:

1
2
3
4
5
[me@linuxbox ~]$ echo Front-{A,B,C}-Back
[me@linuxbox ~]$ echo Number_{1..5}
[me@linuxbox ~]$ echo {Z..A}
[me@linuxbox ~]$ echo a{A{1,2},B{3,4}}b
[me@linuxbox Pics]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
  1. bash提取

  2. https://my.oschina.net/psuyun/blog/357840

  3. http://m.jb51.net/article/64804.htm
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
file=/dir1/dir2/dir3/my.file.txt
我们可以用 ${ } 分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

- # 是去掉左边(在鉴盘上 # 在 $ 之左边)
- % 是去掉右边(在鉴盘上 % 在 $ 之右边)
- 单一符号是最小匹配﹔两个符号是最大匹配。

${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2

我们也可以对变量值里的字符串作替换:

${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my

利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為my.file.txt 。 (非空值時不作处理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值時不作处理)

${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节

SSH登录

一般ROOT都是禁用远程登录的,但是内网开放其实没所谓。可以通过 匹配特定的规则 开放,或者通过其他方式登录 PermitRootLogin without-password

http://serverfault.com/questions/189574/allow-root-login-from-one-ip-address-only

1
2
3
4
5
6
7
# Authentication:
...
PermitRootLogin no 
...
# Example of overriding settings on a per-user basis
Match Address 192.168.0.214
        PermitRootLogin yes

加快SSH登录:multiplexing

controlpersist 多个连接到相同主机的SSH会话将会共享相同的TCP连接。这样,接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~/.ssh/config
Host myserver.example.com
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p
  ControlPersist 10m
# 其他参数
  User            soulteary
  Hostname        10.11.12.240
  Port            22
  IdentityFile    ~/.ssh/keys/2022
  ControlPath     ~/.ssh/home-xh-%r@%h:%p
  ControlPersist  yes
  TCPKeepAlive    yes
  Compression     yes
  ForwardAgent    yes

可以使用-O check 以及 -O exit参数类中断主连接。

Screen

无惧网络风险,时时交互式的nohup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
screen
screen ls 
screen -r $PID
screen -d -r $PID

screen -X -S [session # you want to kill] quit/kill
screen -ls | grep detached | cut -d. -f1 | awk '{print $1}' | xargs kill
pkill screen

Once connected to the session press Ctrl + A then type :quit

//Creation:
screen -S some_name proc
// Kill detached session
screen -S some_name -X quit

screen -wipe
Should clean all dead screen sessions.

VI

1
2
3
4
ctrl+f          向前翻页
ctrl+b          向后翻页
ctrl+d          向前翻半页
ctrl+u          向后翻半页 

tree

sudo

1
echo "`whoami` ALL=(ALL) NOPASSWD:ALL" | sudo tee "/etc/sudoers.d/dont-prompt-$USER-for-sudo-password"

zsh

如果Linux作为日常使用机器。

监控

glances, htop, iftop iotop bmon dstat, vim jq, tmux screen

大文件

1
2
3
4
5
6
7
8
9
10
split -b=1M -d  file.txt file 

split -l 100 input_file output_file

split --bytes=1M /path/to/image/image.jpg /path/to/image/prefixForNewImagePieces
cat prefixFiles* > newimage.jpg

$ split --bytes 500M --numeric-suffixes --suffix-length=3 foo foo.
$ split -b 100k -d -a 3 foo foo.
$ cat foo.* > foo_2

虚拟内存

收藏

–END

Comments