几个有意思的linux命令

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。

转载于:https://my.oschina.net/tinyhare/blog/828320

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值