阿里山QQ

导航

linux命令

1、nc命令详解

#侦听和连接任意的TCP或UDP数据
nc - arbitrary TCP and UDP connections and listens
#参数:
nc 
    -i interval:时间周期
    -p source_port:源端口
    -s source_ip_address:源IP
    -T ToS
    -w timeout
    -X proxy_protocol
    -x proxy_address[:port]] [hostname] [port[s]]
    -l listen:监听模式,只能监听进向连接,不能监听初始化的连接,不能与-s,-p,-z参数联合使用,在使用-w参数设置超时时间时会失效.
    -n 直接使用IP地址,不使用DNS解析
    -z 扫描通信端口,不发送任何数据
    -u 使用UDP协议,默认为TCP协议
    -v 输出过程

[root@MySQL ~]# nc -l 1234   #通过1234端口连接
nihao

[root@ZabbixServer ~]# nc 192.168.72.16 1234
nihao

 

 

实例:通过NC监听51444端口,服务端通过该端口发送实时更新的日志信息,客户端接收日志信息

tail -f  DASHBOARD_ht__564c08f5-02.log |xargs -i echo {} |nc -u -p 51444 172.27.4.2 51444    #服务端启用了udp进程

nc -u -l 51444 >> aa.txt    #客户端接收信息到指定文件中;注意:如果文件aa.txt使用tail -f实时查看更新的话,就有可能造成该文件被锁定,导致后续的日志更新内容无法写入;
View Code

2、tee命令

tee命令的作用是在同时输出命令结果的时候,将命令的输出加入的指定的文件中,如下:
[root@MySQL ~]# who |tee (-a可选,表示追加) who.out

当然,tee命令后面跟的内容也可以是别的终端
View Code

3、用()和{}将命令结合在一起

如果希望将几个命令结合在一起执行,shell提供了两种方法,既可以在当前shell也可以在子shell中执行一组命令。

如下:

[root@MySQL ~]# ls && ( who;ps -ef; )
如果使用{}来代替(),那么相应的命令将在当前shell中作为一个整体被执行。
如下:
[root@MySQL ~]# A=1;echo $A;{ A=2; };echo $A   #改变了当前shell的值
1
2
[root@MySQL ~]# A=1;echo $A;( A=2; );echo $A    #未改变当前shell的值
1
1
View Code

4、awk内置函数

a、gsub(r,s)   #在整个$0中用s替代r
     gsub(r,s,t)    #在整个t中用s替代r
gsub函数有点类似于sed查找和替换,它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式形式执行;
[root@MySQL ~]# cat >> grade.txt <<EOF
> J.Troll 07/99   4842    Brown-3 12      26      26
> EOF
[root@MySQL ~]# awk 'gsub(/4842/,4888){print $0}' grade.txt 
J.Troll 07/99   4888    Brown-3 12      26      26
[root@MySQL ~]# cat grade.txt      #不会改变原文件的内容
J.Troll 07/99   4842    Brown-3 12      26      26

b、index(s,t)    #返回s中字符串t的第一个位置
[root@MySQL ~]# awk 'BEGIN {print index("Bunny","ny")}'
4

c、length    #返回所需要字符串的长度
[root@MySQL ~]# awk 'BEGIN {print length("This is a test")}'    
14

d、match    #测试目标字符串是否包含查找字符串的一部分,可以对查找部分使用正则表达式,成功出现字符的排列数,失败返回0,如下:
[root@MySQL ~]# awk 'BEGIN {print match("ABCD",/d/)}'
0
[root@MySQL ~]# awk 'BEGIN {print match("ABCD",/C/)}'
3
[root@MySQL ~]# awk '$1=="J.Troll" {print match($1,"r")}' grade.txt

e、split    #将字符串通过指定的字符进行分割,放入指定的数组中
[root@MySQL ~]# awk 'BEGIN {split("123#456#789",array,"#");for(i=1;i<=3;i++)print a
rray[i]}' 

在使用awk数组的时候:
[root@MySQL ~]# awk 'BEGIN {record="123#456#789";split(record,myarray,"#")} END{for
 (i in myarray) {print myarray[i]}}' grade.txt 
123
456
789

f、substr   
[root@MySQL ~]# awk '$1=="J.Troll" {print substr($1,1,5)}' grade.txt    #从指定字符串的1~5截取字符串
J.Tro

[root@MySQL ~]# awk '{print substr($1,3)}' grade.txt 
Troll    #从第三个字符开始往后截取
[root@MySQL ~]# awk 'BEGIN{STR="This is a test"} END{print substr(STR,4)}' grade.tx 
t 
s is a test
View Code

 5、set和eval

set 可以设置系统的变量
[root@MySQL shelltest]# set -- "I am " Charles
[root@MySQL shelltest]# echo $#    #变量的个数
2

eval  有双重扫描作用,如下
[root@MySQL shelltest]# a1=123
[root@MySQL shelltest]# b=1
[root@MySQL shelltest]# echo $\{a$b}
${a1}
[root@MySQL shelltest]# eval echo $\{a$b}
123
View Code

 6、awk引用外部变量

当awk运行于shell环境中的时候,awk命令要事先经过shell解释器解释,然后交给awk解释,awk引用外部变量有如下几种方式:
1、使用-v参数(推荐)
[root@MySQL scripts]# awk -v a=111 -v b=222 '{print a,b}' ceshi.txt 
111 222
111 222
111 222
2、使用单双引号
[root@MySQL scripts]# echo $LOGNAME
LOG
[root@MySQL scripts]# awk '{print "'"$LOGNAME"'"}' ceshi.txt 
LOG
LOG
LOG
这里解释一下外什么要加两个双引号和一个单引号:
$ str=Hello
$ awk 'BEGIN{print " '$str' "}'
Hello
看上去是双引号套单引号,其实真正的原因为:
这是shell的功能,shell对单引号和双引号,按从左到右的顺序成对匹配
awk命令用单引号引起来,就是防止shell对其中内容进行解释
awk '{print " '$str' "}' file
实际上就是2部分
1:awk '{print " '
2:'"}'
即awk对2个单引号内的命令起作用
View Code

 7、在grep中匹配字符串时的点号问题

#点号会作为任意单个字符处理,如果在字符串中存在.号而没有转义,有可能会匹配到多余的文件或内容
[root@MySQL ~]# ls -l |grep --color "TTS.*160222.transaction.001.log" 
-rw-r--r--  1 root root    0 Mar 17 11:30 TTS.160222.transaction.001.log
-rw-r--r--  1 root root    0 Mar 17 13:17 TTS.160222.transaction1001.log

[root@MySQL ~]# ls -l |grep --color "TTS.*160222.transaction\.001\.log" 
-rw-r--r--  1 root root    0 Mar 17 11:30 TTS.160222.transaction.001.log
View Code

 

8、"2>&1"放置在">"前面和后面的区别

首先看一个例子:

[root@myhost ~]# aa 2>&1 > test    #和aa >test效果一样
bash: aa: command not found...

[root@myhost ~]# cat test    #值为空

[root@myhost ~]# ls 2>&1 >test
[root@myhost ~]# cat test     #有值
123
456
aa
aaaaa

[root@myhost ~]# aa >test 2>&1 [root@myhost ~]# cat test #test内容 bash: aa: command not found...

 

 

linux命令手册:http://man.linuxde.net/    

 

参考博客:https://phpor.net/blog/

posted on 2016-04-07 13:10  阿里山QQ  阅读(223)  评论(0编辑  收藏  举报