【操作系统】Bash杂谈

 

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进制的11110进制形式

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表示连接文件的文件名

 

合并stdoutstderr的三种等价的方法,第一种首选:

&>/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

这样,4210这四个十进制数(作为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

同理,84210可以排出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

 

关于grepawkbuffer的问题

 

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 &

sedawk处理文件一例

原格式

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值