Bash杂谈
by tay
关于which命令:
如果两个重名的命令,而且都在$PATH环境变量之中,则按照$PATH变量的前后顺序来查找
如:
[root@fx_local2 ~]# echo $PATH
/bin/1:/bin/2:/bin/3
而两个名为abc的命令分别在/bin/1和/bin/2中,那么which abc则只显示/bin/1
如果;
1、立刻将当前的$PATH改为:/bin/2:/bin/1:/bin/3,则执行的abc会立刻变为/bin/2中的,而which命令也会变
2、将命令从其所在目录移走,则which命令会立刻变,但命令行必须注销或重新login
test -h file:
如果file是个连接文件、且存在(被连接的文件可以不存在),则$?为0
如果还想判断它是不是个坏连接,则再用 -e 即可,目录用 -d
时区相关:
TZ=EST date
$TZ 定义时区为EST,然后只给date (对系统没有影响)
TZ='Asia/Tokyo';export TZ
$TZ 定义时区为JST,当前系统的时区改变(当前shell)
zdump EST
输出以EST作为时区的当前时间
进制相关:
[root@fx_local2 ABS]# let a=2#111
[root@fx_local2 ABS]# echo $a
7
[root@fxstest2 ~]# echo $((2#111)) # 输出2进制的111的10进制形式
7
[root@fxstest2 ~]# echo " ibase=16;obase=2; FF" | bc # 输入是16进制,输出是2进制
11111111
Bash间接引用,“指针”:
[root@fx_local2 ~]# i=aaa
[root@fx_local2 ~]# p=i # 定义了一个到i的指针
[root@fx_local2 ~]# echo ${!p} # 输出指针的值,相当于:echo${i}
aaa # 相当于$i的值
[root@fx_local2 ~]# eval echo /$$p # 和这种写法等效
aaa
输出脚本的最后一个参数:
#!/bin/bash
echo ${!#}
关于$0与软连接:
如果以连接的形势执行脚本,则$0表示连接文件的文件名
合并stdout和stderr的三种等价的方法,第一种首选:
&>/dev/null
>&/dev/null
>/dev/null 2>&1
[root@fx_local2 test]# ls none &>/dev/null
[root@fx_local2 test]# ls none &>tmp.txt
[root@fx_local2 test]# cat tmp.txt
ls: none: No such file or directory
[root@fx_local2 test]# (time uptime) &>tmp.txt
[root@fx_local2 test]# cat tmp.txt
12:09:09 up 11 days, 3:04, 4 users, load average: 1.59,1.57, 1.55
real 0m0.002s
user 0m0.001s
sys 0m0.001s
内置变量$REPLY:
[root@fx_local2 ~]# read
ABC
[root@fx_local2 ~]# echo $REPLY
ABC
vim列块选取:
快捷键: ctrl + v
得到当前终端的长宽:
[root@fxstest2 Shell2]# stty size
64 140
[root@fxstest2 Shell2]# tput lines
64
[root@fxstest2 Shell2]# tput cols
140
显示一个文本文件中以AAA开头 到 以BBB开头 之间的行
sed -n '/^AAA/,/^BBB/p' txt
Gtk弹出确认窗口
zenity --info --text 'hello world !!!'
linux系统自带的字典,45427个单词
/usr/share/dict/linux.words
ping一个网段,看回显,用nmap
nmap -sP -n 172.27.205.0/24
awk数组排序
[root@fxstest1 ~]# echo -e "20/n3/n10/n56/n75/n1" | awk'{a[i++]=$1}END{asort(a);print a[i]}'
75
tail命令相关
tail -f /tmp/ttt | sed '/xxx/Q'
当出现“xxx”字符之后,再“xxx”不再出现时,tail命令则退出
tail --pid=PID 指定tail命令的pid
通过时间戳得到当前时间
date -d "00:00:00 1970-01-01 UTC +1156523905 sec"
screen命令
第1步:screen -Ss1 新开一个“终端”,执行一些命令在前台执行,如:sleep 1000000
第2步:ctrl + a +d 切换回原来那个终端,此时sleep将继续执行
第3步:ctrl + dlongout
第4步:重新登录,发现sleep还在执行
第5步:screen -rs1,切换到前台执行的sleep那个终端
利用二进制做排列组合
类似于linux系统的文件权限管理,
100 = 4
010 = 2
001 = 1
000 = 0
这样,4、2、1、0这四个十进制数(作为mark),通过加和,可以排出8种情况
即:
7 = 4 + 2 + 1
6 = 4 + 2 + 0
5 = 4 + 0 + 1
4 = 4 + 0 + 0
3 = 0 + 2 + 1
2 = 0 + 2 + 0
1 = 0 + 0 + 1
0 = 0 + 0 + 0
同理,8、4、2、1、0可以排出16种情况
显示两个字符所在行,之间的行
[root@fxstest1 ~]# seq 9 | sed -n '/3/,/8/p'
3
4
5
6
7
8
[root@fxstest1 ~]# seq 9 | sed -n '/3/,/8/p' | sed '1d;$d'
4
5
6
7
关于grep、awk的buffer的问题
tail -f a.txt | grep --line-buffered "^1" >>b.txt&
对于tail -f 这种不停增加的,只有加上 --buffered 参数,
这样才能将a.txt文件中的,以1开头的行,不停的追加到b.txt文件中
对于awk是这样:
tail -f a|awk '/^1/{print;fflush()}' >>b &
sed和awk处理文件一例
原格式
192.168.0.1&1=99&2=100
192.168.0.2&1=100&3=111
192.168.0.3&1=99&2=1&3=111
192.168.0.4&1=99&3=111&4=110
192.168.0.5&1=99&2=111&3=66&4=100&5=44
处理后
192.168.0.1 99 100 0 0 0
192.168.0.2 100 0 111 0 0
192.168.0.3 99 1 111 0 0
192.168.0.4 99 0 111 110 0
192.168.0.5 99 111 66 110 44
awk -F'[&=]''BEGIN{for(j=1;j<=6;j++)a[j]=0}{for(k=2;k<NF;k+=2)a[$k]=$(k+1);print$1"/t"a[1]"/t"a[2]"/t"a[3]"/t"a[4]"/t"a[5];for(j=1;j<=6;j++)a[j]=0}'urfile
sed -r's/&//n1/n2/n3/n4/n5/&/;:a;s//n(.)(.*)&/1=([^&]+)//t/3/2/;ta;s//n./b//t0/g
处理之后发现sed 比 awk 在这种处理上效率要快好多
awk汇总去重文件一例
转换前
china www.example.com 192.168.0.1 80
usa www.example.com 192.168.0.1 80
china www.example.com 192.168.0.1 81
usa www.example.com 192.168.0.1 81
china www.example.com 192.168.0.1 82
usa www.example.com 192.168.0.1 82
转化后
china,usa www.example.com 192.168.0.1 80
china,usa www.example.com 192.168.0.1 81
china,usa www.example.com 192.168.0.1 82
awk '{if(a[$3" "$4" "$5]!~ $1) a[$3" "$4" "$5]=a[$3" "$4""$5]","$1;if(b[$3" "$4""$5] !~ $2)b[$3" "$4" "$5]=b[$3""$4" "$5]"|"$2}END{for (i in a) {printsubstr(a,2)" "substr(b,2)" "i}}'
本文原创自无线技术运营空间: http://wireless.qzone.qq.com 及http://blog.csdn.net/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:1780551083@qq.com)