jq
解析json的命令行工具
https://stedolan.github.io/jq/
sort
排序命令
ls -l | sort -nk5 相当于 ls -lrS 按文件大小排序
特别的-R能乱序
uniq
前提是内容已排序
基本用法是去重 cat file.txt | uniq
-c 用来计数, -u 用来只显示不重复的内容,-d用来只显示重复的内容
join
将两个文件按某列合并成一个文件
$ cat testfile1 a India b US c Ireland d UK e Canada $ cat testfile2 NewDelhi a Washington b Dublin c London d Toronto e $ join -1 1 -2 2 testfile1 testfile2 a India NewDelhi b US Washington c Ireland Dublin d UK London e Canada Toronto
split
分割文件成多份
按行数分割文件 split -l200 file.txt
按大小分割文件 split -b 50K file.txt
xargs
xargs 的man手册解释是:从标准输入 创建并执行 命令行。
有些命令或程序是从命令行获取参数实现某个功能,比如echo ,ls。另外一些程序是从管道,标准输入得到数据进行处理,比如sed,awk,grep等(也就是能用管道符|串联起来的程序)。
如果想把echo, ls 或自己写的脚本这些不支持管道的命令和管道连起来用就可以使用xargs了。 、
root@hare:~# cat a
a.png a.sh
a.txt
root@hare:~# cat a | echo
# 没错,输出是一个空白,echo不会从管道获取内容,相当于执行了 echo ""
root@hare:~# cat a | xargs echo
a.png a.sh a.txt
#把所有内容当成一个参数 echo a.png a.sh\na.txt , 命令行会把换行当空白符,即相当于 echo "a.png a.sh a.txt"
root@hare:~# cat a | xargs -l echo
a.png a.sh
a.txt
# -l 或 -L 参数指定每次生成的命令最多传"几行"参数,l如果不指定数量默认是1,即相当于 echo "a.png a.sh"; echo "a.txt"
root@hare:~# cat a | xargs -n1 echo
a.png
a.sh
a.txt
# -n 参数指定每次生成的命令传"几个"参数, -n 1 相当于 echo a.png; echo a.sh; echo a.txt
root@hare:~# cat a | xargs -n1 -P3 echo
a.txt
a.sh
a.png
# -P 参数是并发多少进行,本例相当于 echo a.png& echo a.sh& echo a.txt&
# 还有一个-r 参数,使如果输入是空,则不执行
parallel
这个命令一般需要安装,是用来并发执行命令或程序的。其实就是个perl脚本。
能并发执行的程序,一般是不依赖不影响运行环境上下文的程序。有的时候相当于xargs -P
比如有个文件列表要并发的压缩等。
mktemp
生成临时文件或临时路径,返回文件/路径名字
root@hare:/# mktemp
/tmp/tmp.GCCOsCAVHF
root@hare:/# mktemp -d
/tmp/tmp.JqC85iOd5g
rev
逆序字符串
root@hare:~# cat a
123456789
abcdefghijklmnopqrstuvwxyz
root@hare:~# cat a | rev
987654321
zyxwvutsrqponmlkjihgfedcba
root@hare:~#
这个命令有一个用处,当我们分析数据时可能需要"倒数"第几列,但是有些命令只提供正序第几列的指定,那么用这个命令就能把倒数第几列变成正序第几列,处理完后再逆回去就好了。
numfmt
是一个把数字变得human readable或反向变化的命令,自己写的脚本可以方便转换了。
看看下边两个命令是否结果一样
ls -lh
ls -l | numfmt --header --field 5 --to=iec
--header 第一行内容不需转换
--field 5 转换第5列
进制由--from --to的UNIT options决定:si 1000 , iec 1024 详情看man手册
root@hare:~# echo 1000 | numfmt --to=si
1.0K
root@hare:~# echo 2048 | numfmt --to=iec
2.0K
原始数据单位不为1,则用 --from-unit 配置
root@hare:~# echo 1024 | numfmt --from-unit=1024 --to=iec
1.0M
# 单位1024,即K, 所以原始1024是1024的意思
flock
flock是一个 管理程序运行的锁工具,它使用一个文件做为文件锁,可以用来防止脚本的多次重复启动,比如一个程序每五分钟运行一次,前一次五分钟没有运行完,第二个进程不能让他启动,要延迟或干脆让他它失败
flock -xn /tmp/lockfile.lock -c 'command arg arg'
-x或-e 排他锁(默认),遇到共享锁和排他锁都会等待
-s 共享锁,多个共享锁可同时执行,遇到排他锁会等待
-n 非阻塞,文件已经加过锁则直接退出不等待
-w 等待锁的时间,单位秒,超时退出
保证程序只有一个实例在运行
flock -xn /tmp/lockfile.lock -c 'ping 127.0.0.1 -c 500'
是实例排队执行不并发
flock -x /tmp/lockfile.lock -c 'ping 127.0.0.1 -c 500'
如果一批命令有的可以并发执行,但有命令和并发的有冲突,则可以在一个文件上并发的用-s,排他的-x
shred
彻底擦除文件,使其不可被恢复。
root@ansible:~# shred -fuzv a.log
shred: a.log: pass 1/4 (random)...
shred: a.log: pass 2/4 (random)...
shred: a.log: pass 3/4 (random)...
shred: a.log: pass 4/4 (000000)...
shred: a.log: removing
shred: a.log: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: a.log: removed
root@ansible:~#
rename
批量重命名,这个命令有两个版本,一个是C版本一个是Perl版本,现在最常见的是Perl版本
rename perlexpr [ files ]
rename 's/\.bak$//' *.bak 将所有*.bak文件删掉后缀
rename 'y/A-Z/a-z/' * 将所有文件名大写改小写
rename 's/[[:space:]]+/_/g' * 空格改下划线
rename 's/^/hello/' * 开头加上hello
rename 's/.html$/.htm/' * 扩展名html改为htm
rename 's/$/.zip/' * 结尾加zip后缀
tee
其他命令的结果既想在标准输出显示,又想保存到文件那就用tee吧
root@hare:~# cat a.txt
cat: a.txt: No such file or directory
root@hare:~# echo 'hello world' | tee a.txt
hello world
root@hare:~# cat a.txt
hello world
root@hare:~#
如果想追加到文件可用-a参数:| tee -a a.txt
column
使命令行输出按列对齐
root@hare:~# cat test.txt
aaaaaaa bbbbb
aa bbbbbbbbbbbbb
a bbbbbbbbbbbb
aaaaaaaaaaa b
aaaaa bbbbbbbb
aa bbbbbbbbbbbb
root@hare:~# cat test.txt | column -t
aaaaaaa bbbbb
aa bbbbbbbbbbbbb
a bbbbbbbbbbbb
aaaaaaaaaaa b
aaaaa bbbbbbbb
aa bbbbbbbbbbbb
root@hare:~#
watch
周期的执行某个命令
root@hare:~# date +%s
1484873260
root@hare:~# watch -d -n 1 'date +%s'
Every 1.0s: date +%s Fri Jan 20 11:13:05 2017
1484881985
timeout
让命令最长执行一定的时间,超过设置的时间就会被kill掉
root@hare:~# timeout 5 wget http://www.51cache.com/dl/400m.file
--2017-01-20 08:37:30-- http://www.51cache.com/dl/400m.file
Resolving www.51cache.com (www.51cache.com)... 119.90.17.34
Connecting to www.51cache.com (www.51cache.com)|119.90.17.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 419430400 (400M) [application/octet-stream]
Saving to: ‘400m.file.1’
3% [==> ] 13,091,122 2.71MB/s eta 2m 32s
root@hare:~#
chattr
这个其实只是修改文件特殊属性的命令,chattr +i file 可以用来保护文件不会被修改删除,当你辛辛苦苦做了数据库备份,一个不小心给覆盖了时,你就想用这个了,做好的备份先锁住,解锁是chattr -i file。
test:root@hare:~# chattr +i a.txt
test:root@hare:~# cat a.txt
hello world
test:root@hare:~# echo 'world hello' > a.txt
-bash: a.txt: Permission denied
test:root@hare:~# rm a.txt
rm: cannot remove ‘a.txt’: Operation not permitted
unshare
这个命令用来取消与父进程的命名空间共享,详情搜索linux命名空间,容器技术和命名空间的操作很有关系。这里我用这个命令做什么呢?挂载特殊的文件而不影响系统,比如hosts文件,一些程序的测试配置文件。
root@hare:~# echo $$
1266
root@hare:~# cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 hare
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@hare:~# unshare -m bash
root@hare:~# echo $$
3334
root@hare:~# echo '1.1.1.1 a.b.c.d' > ./hosts
root@hare:~# mount --bind -n ./hosts /etc/hosts
root@hare:~# cat /etc/hosts
1.1.1.1 a.b.c.d
root@hare:~# exit
exit
root@hare:~# cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 hare
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@hare:~#
执行 unshare -m bash后将会用隔离的文件系统挂载(-m)启动一个新的bash,你可以挂载不同的配置文件做测试,并不影响原系统的运行。
如果你想写个脚本那么可以将下面内容加到首行:(别人写的,有问题不要找我哦/(ㄒoㄒ)/~~)
#! /usr/bin/perl -eexec 'unshare', '-uimn', '/bin/bash', @ARGV
trickle
这是一个限制TCP(UDP无效哦)连接网速程序,当我们使用的命令没有限速参数时可以考虑试试这个,它只对使用libc库的程序起作用。
root@hare:~# trickle -s -d 13K -u 14K wget http://www.51cache.com/dl/400m.file
--2017-01-19 08:53:09-- http://www.51cache.com/dl/400m.file
Resolving www.51cache.com (www.51cache.com)... 119.90.17.34
Connecting to www.51cache.com (www.51cache.com)|119.90.17.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 419430400 (400M) [application/octet-stream]
Saving to: ‘400m.file’
0% [ ] 360,448 13.6KB/s eta 8h 21m
-d限速下载速度,-u限速上传速度
pv
这个可以用来显示或限制数据通过管道"|"的传输速度
# cat /dev/zero | pv > /dev/null
9.5GB 0:00:14 [2.46GB/s] [ <=> ]
# cat /dev/zero | pv -L 30k > /dev/null
180kB 0:00:06 [30.1kB/s] [ <=> ]
pgrep和pkill
在寻找进程ID或判断进程是否存在时,你是不是觉得 ps aux | grep xxx | grep -v grep 有的时候显得很啰嗦?那尝试下pgrep吧。
pgrep [options] pattern(pattern支持正则表达式)
pkill [options] pattern
root@hare:~# pgrep nginx
1008
1009
1010
1011
1012
不确定找到的进程是否正确?那就显示进程名和参数看看
root@hare:~# pgrep -fa nginx
1008 nginx: master process /usr/sbin/nginx
1009 nginx: worker process
1010 nginx: worker process
1011 nginx: worker process
1012 nginx: worker process
-fa是无参数值的短参数连写啦,你可以写成-f -a, -f是匹配进程名和参数,否则只匹配进程名、-a是显示时显示进程ID,进程名和参数,否则只显示进程ID。
pkill就是找到进程后kill掉(其实是发送SIGTERM信号,也可以--signal参数指定发送的信号啦),使用前最好用pgrep看看进程找的对不对。
root@hare:~# pgrep -fa 127.0.0.1
3238 ping 127.0.0.1
3239 ping 127.0.0.1
3240 ping 127.0.0.1
3241 ping 127.0.0.1
root@hare:~# pkill -f 127.0.0.1
root@hare:~# pgrep -fa 127.0.0.1
root@hare:~#
ipcalc
一个 IPv4 掩码/广播地址/等等的计算器,可以用来检验网络配置是否正常,用来学习网段掩码也是极好的。
用法:ipcalc IP地址/[掩码位数 |掩码]
ipcalc IP地址 [掩码位数 |掩码]
root@ansible:~# ipcalc 192.168.1.24 255.255.255.0
Address: 192.168.1.24 11000000.10101000.00000001. 00011000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001. 00000000
HostMin: 192.168.1.1 11000000.10101000.00000001. 00000001
HostMax: 192.168.1.254 11000000.10101000.00000001. 11111110
Broadcast: 192.168.1.255 11000000.10101000.00000001. 11111111
Hosts/Net: 254
结果中可以看到网络号(Network),最小IP(HostMin),最大IP(HostMax),广播地址(Broadcast),也就是说一个网段全0是网络号,全1是广播地址,剩下的才能给设备用,每分一个网段都会浪费两个IP。