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实时查看更新的话,就有可能造成该文件被锁定,导致后续的日志更新内容无法写入;
2、tee命令
tee命令的作用是在同时输出命令结果的时候,将命令的输出加入的指定的文件中,如下: [root@MySQL ~]# who |tee (-a可选,表示追加) who.out 当然,tee命令后面跟的内容也可以是别的终端
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
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
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
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个单引号内的命令起作用
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
8、"2>&1"放置在">"前面和后面的区别
首先看一个例子:
[root@myhost ~]# aa 2>&1 > test #和aa >test效果一样 bash: aa: command not found... [root@myhost ~]# cat test #值为空[root@myhost ~]# cat test #有值
[root@myhost ~]# ls 2>&1 >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/