异想天开

What's the true meaning of light, Could you tell me why

shell工具集

日期:2014-07-23 10:59:59
  
最后更新日期:2020-03-02 11:09:58
【技术文章,非码农勿入】
最后更新日期:2014-12-16

1.bash shell输出十六进制的数
[code lang="cpp"]
printf "%x" 256
[/code]
十六进制转字符
[code lang="cpp"]
printf "\x65\x72"
[/code]
2.unix time时间戳和UTC时间相互转化转化
[code lang="cpp"]
[root@localhost foo]# date -d "1970-01-01 00:00:04 UTC" "+%s"
4
[root@localhost foo]# date "+%Y-%m-%d %l:%M:%S"
2014-07-23 10:58:56
[/code]

3.数值计算
[code lang="cpp"]
整数
[root@localhost ~]# echo $((1*2))
2
echo `expr 1 + 2`
奇葩,这个加号一定需要空格
浮点数
bc
[/code]

4.查看文件创建时间
[code lang="cpp"]
[root@localhost bin]# stat core.25458
File: `core.25458'
Size: 153399296 Blocks: 53552 IO Block: 4096 regular file
Device: 801h/2049d Inode: 263412 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-07-12 02:30:19.079053000 +0800
Modify: 2014-07-12 02:30:14.113064480 +0800
Change: 2014-07-12 02:30:14.113064480 +0800
Modify表明文件最后一次改写的时间,即core文件的创建时间,access表示文件最后一次access时间
[/code]

5.查看程序监听端口
[code lang="cpp"]
#这个显示一个端口只显示一个进程
netstat -tlnp
#查看80端口的使用状况
lsof -n -i:80
#注意一般使用时,加上-n,这样可以避免ip与hostname之间的转化,节省大量时间
[/code]

6.查看进程列表
[code lang="cpp"]
ps -ef | grep nginx
ps aux | grep nginx
[/code]

7.查看系统情况
[code lang="cpp"]
top命令后按1,可以看多核下每核的运行状态
[/code]

8.比较两个文本文件,选出唯一部分,或单独有。
[code lang="cpp"]
#使用comm时,需要对文件内容排序
[root@localhost ~]# comm --check-order a.txt b.txt
a
b
c
d
[root@localhost ~]# cat a.txt | sort
a
b
c
[root@localhost ~]# cat b.txt | sort
a
b
d
[/code]

9.文件去重,uniq只是去掉相邻重复的行
[code lang="cpp"]
[root@localhost tmp]$ cat a.txt | sort -u
a
b
[root@localhost tmp]$ cat a.txt | uniq
a
b
a
[root@localhost tmp]$ cat a.txt
a
a
b
a
[/code]

10.foo.txt文件包含很多"123 abc 456"类似的三行,选择其中第一行
方法一:
[code lang="cpp"]
cat foo.txt | xargs -n 3 echo | awk '{ printf $1"\n"}'
注释:
这里awk使用单引号和双引号有区别
[/code]
方法二:
[code lang="cpp"]
cat foo.txt | while read line
do
awk '{print $1"\n"}'
done
[/code]
方法三:
[code lang="cpp"]
while read line
do
awk '{print $1"\n"}'
done < ./foo.txt
若分割符为":",则echo "1:2:3" | awk -F ":" '{print $2}'
[/code]
这几种的区别在于利用管道传递时,后面相当于fork了进程,变量值不会被修改。

11.查看系统io状态
[code ]
iostat -m
[/code]

12.echo hex值输入字符
[code lang="cpp"]
echo -e '\xe5\xad\x90'
[/code]

13.文件截取或磁盘备份
[code lang="cpp"]
dd if=a.img of=1.txt bs=1 count=$((512*1440)) skip=0
[/code]

14.cut截取列前多少行
[code lang="cpp"]
echo '123456' | cut -b 1-2
[/code]

15.算文件的md5哈希
[code lang="cpp"]
md5sum 文件
[/code]

16.openssl加密文件
[code lang="cpp"]
openssl enc -aes-128-cbc filename.aes-128-cbc
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
解密示例:
$ openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename
enter aes-128-cbc decryption password:
[/code]

17.利用expect做自动交互,安装expect包,可以视为阻塞式的
[code lang="cpp"]
#!/usr/bin/expect
spawn openssl enc -aes-128-cbc -in foo.txt -out foo.txt.aes-128-cbc
expect {
"password:" {
send "123456\n";exp_continue
}
}
[/code]
对于expect用法,可以在shell脚本里面这样使用
[code lang="cpp"]
expect <<EOF expect_excute_statement EOF
/usr/bin/expect -f you.exp
[/code]
其它地方继续使用shell语法。
一个登录服务器用得频繁的脚本:
[code lang="cpp"]
#!/usr/bin/expect
set timeout 10
if { [llength $argv] < 3 } {
puts " Usage: $argv0 <server> <user> <passwd>"
exit 1
}
set server [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]

spawn ssh -l $user $server
expect {
"(yes/no)" { send "yes\r"; exp_continue }
"password:" { send "$passwd\r" }
"Password:" { send "$passwd\r"
}
expect "*Last login*" interact
[/code]


18.查看程序启动时间
[code lang="cpp"]
ps -A -opid,stime,etime,args | grep python
#-A表示所有进程
#stime 表示启动时间
#etime ELAPSED elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
#args 表示程序的参数即argv
[/code]

19.远程执行脚本
[code lang="cpp"]
#方式1
$ ssh user@server bash < /path/to/local/script.sh
#方式2,利用expect来做交互
[/code]

20.nc用法-netcat 网络瑞士军刀
[code lang="cpp"]
#扫描端口
$ nc -z -v -n 127.0.0.1 20-100
#测试某个http的cmd
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
#nc 发送邮件
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF
#Open a TCP connection to port 42 of host.example.com, using port 31337 as the source port, with a timeout of 5seconds:
$ nc -p 31337 -w 5 host.example.com 42
#Open a UDP connection to port 53 of host.example.com:
$ nc -u host.example.com 53
#Create and listen on a Unix Domain Socket:
$ nc -lU /var/tmp/dsocket
#Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
[/code]

21.查看当前文件夹大小
[code lang="cpp"]
du -h --max-depth=1 .
[/code]

22.简单快速http压力负载测试
[code lang="cpp"]
#向测试host:80 30s内发送20个连接,siege需自己编译,为多线程版本
siege -c20 test_host -b -t30s
ab -c20 -n 10000 http://host_uri
[/code]

23.查看内核发行版本号
[code lang="cpp"]
cat /etc/issue
[/code]

24.获得外网ip
[code lang="cpp"]
#可以直接登录ip138查询,也可以使用ifconfig.me提供的服务
curl ifconfig.me
[/code]

25.查看程序的内存使用
[code lang="cpp"]
#方法1
top -d -p pid
#方法2
pmap pid
[/code]

26.tar包目录时,去掉某个子目录
[code lang="cpp"]
tar --exclude=子目录1 --exclude=子目录2 目录1 目录2
[/code]

27.shell脚本里面数字计算
[code lang="cpp"]
$((2+5))
[/code]

28.查看程序系统调用
[code lang="cpp"]
//查看线程号
top -H
pstree -p 进程号
strace -p 上面看到那个号
[/code]

29.vim
[code lang="cpp"]
//在vim中shift+insert键插入代码时,为避免自动转换格式或自动注释,在配置文件~/.vimrc里面添加:
set paste
//用shell连接服务器,vim编辑文件时,右键不可用了,可以在~/.vimrc设置,注意这里尝试过网上的的方法+y,然后在word里面,粘贴好像并不能全局。使用下面的方法有个副作用就是编辑模式,光标不会跟着鼠标动
set mouse=
//vim目录操作
set autochdir
[/code]

30.shell脚本执行命令流水线。
例子:用得多的,比如经常登录某台机器的mysql,那么可以将写成如下shell脚本:
[code lang="cpp"]
#!/bin/sh
if [ $# -lt 1 ]
then
echo " Query movie db info use default value"
echo " Usage:$0 sql"
sql="select version()"
else
sql=$1
fi
mysql -h10.0.0.5 -uuser -ppassword <<EOF
$sql
EOF
[/code]
然后将该脚本添加到PATH目录,以后执行以后就非常方便了。

31.sed替换文件部分内容
[code lang="cpp"]
echo -e "ENGINE=MyISAM AUTO_INCREMENT=265311 DEFAULT CHARSET=latin1;\nENGINE=MyISAM AUTO_INCREMENT=265311 DEFAULT CHARSET=latin1;" | sed "s/AUTO_INCREMENT=[0-9]\{1,\}/AUTO_INCREMENT=1/"
[/code]
将数据库自增字段,替换为1。

32.vi查看函数的man手册
在vim里面,按shift+k,查看光标所在处的函数man手册

33.shell编程语法
[code lang="cpp"]
#shell 函数
function test() {
echo 'hello world'
return 0
}
test
[/code]
[code lang="cpp"]
#shell case 相当于c语言的switch
case $1 in
'list') list;;
'test_conf_all') test_conf_all;;
'test_conf_of_redis_crash') test_conf_of_redis_crash ;;
esac
[/code]

[code lang="cpp"]
#if -else 1
if [ $# -lt 1 ]
then
echo 'Usage:$0 <function>'
echo 'example: $0 list'
exit
fi

#if -else 2
if [ $# -lt 1 ] ; then
echo 'Usage:$0 <function>'
echo 'example: $0 list'
exit
fi
[/code]

[code lang="cpp"]
#赋值,脚本中注意ps环境不一样,多-v一下
redispid=`ps -ef | grep redis | grep -v grep | awk '{print $2}'`
if [ -n "$redispid" ] ; then
kill -9 $redispid
fi
[/code]

第一次看到下面这个shell脚本,惊呆了,shell还可以这样来获取参数的值。
[code lang="cpp"]
#!/bin/sh

for option
do
echo $option
done
[/code]
对于整数的比较是-eq之类的,字符串的比较直接是=,假设比较$a="a",一般会这么写,"$a"x = "ax"。

34.linux系统设置与同步时区
centos系统
1.cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.ntpdate -s time.nist.gov( yum install -y ntpdate )

35.统计某个字符出现的个数
[code lang="cpp"]
#vi里面命令行模式输入
%s/test//gn
[/code]

36.vim tab变空格
[code lang="cpp"]
//已经有tab的文件替换为空格:
:set ts=4
:set expandtab
:%retab!
//要求vim输入tab自动替换为4个空格,对于python类脚本文件
//vim简单配置文件
set paste
set nu
autocmd FileType py set shiftwidth=4 | set expandtab
%retab!
hi Comment ctermfg = blue
set fencs=utf-8,gbk
set hlsearch #匹配高亮
set list #显示空格
[/code]

37.向linux传文件
yum install lrzsz
rz(recive),sz(send)是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具,搞笑的是sz ./nginx.gz这样带有./表示当前路径,在xshell上面会不停的刷屏。

38.wget下载文件
[code lang="cpp"]
wget -r -nH --tries=1 "http://www.xxx.com/download/xxx.txt"
//下载的目录,将是download/xxx.txt,-nH去掉host目录
[/code]

39.ctags+vim。vim中ctrl+]有多个tag时,可以:tn 查看下一个tag或:tp 查看前一个tag。tselect tag。
[code lang="cpp"]
ctags --excmd=number -R * ./
[/code]
-excmd=number表示仅定位到行,这样的好处在于,比如cpp文件是gbk,ctags搜索的关键字所在的行,包含中文时,ctags总不能正确定位。

40. 转换文件档案格式,windows转为unix
[code lang="cpp"]
find ./ \( -name "*.cpp" -o -name "*.h" \) -print | xargs dos2unix
[/code]

41. VIM 加密
命令行模块,输入:X即可。取消密码: set key=即可。

42. 设置用vim打开crontab
在/home/username/.bashrc 添加export EDITOR=vim

43.rsync
当ssh端口不是22时
rsync -av -e "ssh -p 36000" root@${host}:${path} ./
scp -r root@${host}#${port}:${path}

43. vim忽略大小写搜索
:set ic(ignorecase 的缩写) 忽略大小写
:set noic(noignorecase 的缩写) 不忽略大小写

44. find命令 查找3天前的文件
[code lang="cpp"]
[root@~ test]# touch access_ssl.log.1.log
[root@~ test]# date -s '-3 days'
2017年 06月 15日 星期四 14:58:30 CST
[root@~ test]# date -s '-3 days'
2017年 06月 12日 星期一 14:58:31 CST
[root@~ test]# touch access_ssl.log.2.log
[root@~ test]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月 18 2017 access_ssl.log.1.log
-rw-r--r-- 1 root root 0 6月 12 14:58 access_ssl.log.2.log
[root@~ test]# date -s '+3 days'
2017年 06月 15日 星期四 14:58:52 CST
[root@~ test]# date -s '+3 days'
2017年 06月 18日 星期日 14:58:52 CST
[root@~ test]# find ./ -mtime +3 -name "access_ssl.log.*"
./access_ssl.log.2.log
[root@~ test]# find ./ -mtime -3 -name "access_ssl.log.*"
./access_ssl.log.1.log
[/code]

45.改密码
[code lang="cpp"]
echo "用户名:新密码" | chpasswd
[/code]

46. 修改防火墙
[code lang="cpp"]
iptables -L -n --line-number
删除上面指定的类别和行号
iptables -D 类别(INPUT/OUTPUT) 行号
iptables -L -n --line-number 再验证
若为centos系统,可以用service iptables save备份。
若为ubuntu系统,则可以
iptables-save > /etc/iptables.up.rules
将iptables-restore < /etc/iptables.up.rules 插入/etc/network/interfaces配置文件
[/code]

47. 中文乱码
[code ]
export LANG=zh_CN.utf-8
[/code]

48. 配置域名服务器
[code ]
将dns服务器添加到/etc/resolve.conf里面
[/code]

49. mac挂载远程服务器目录
[code lang="cpp"]
#挂载
sshfs -C -o reconnect root@9xiaoxiao.com:/tmp/ ./tmp/
#取消
sudo diskutil umount force ./tmp/
[/code]

50. clion跳转和返回
command + option + b跳转
command + option + left返回
command + option + right前进