xargs
- -a file 从文件中读入作为 stdin
- -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
- -p 当每次执行一个argument的时候询问一次用户。
- -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
- -t 表示先打印命令,然后再执行。
- -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
- -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
- -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
- -L num 从标准输入一次读取 num 行送给 command 命令。
- -l 同 -L。
- -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
- -x exit的意思,主要是配合-s使用。。
- -P 修改最大的进程数,默认是1,为0时候为as many as it can
docker

循环访问机器当前开放端口:
for i in $(netstat -anopt|grep LIST|awk '{print $4}'); do curl -I -m 3 -o /dev/null -s -w "%{http_code} %{url_effective}\n" $i'/'; done
- -I 仅测试HTTP头
- -m 3 最多查询3s
- -o /dev/null 屏蔽原有输出信息
- -s silent模式,不输出任何东西
- -w %{http_code} 控制额外输出,当前为状态码,url
获取所有docker容器保存日志位置
docker ps |awk 'NR>1{print $1}'|xargs -I {} docker inspect --format="{{json .LogPath}}" {}
获取所有docker映射端口关系
docker ps |awk ‘NR>1{print $1}’|xargs -I {} docker inspect –format=”{{json .NetworkSettings.Ports}}” {}
grep匹配两个字符串之间的字符
grep -P的使用。
Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of nimplemented features.
-P, –perl-regexp
这意思是,-P 可以让grep使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。
最典型的用法是,匹配指定字符串之间的字符。 比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符串(my name is) 可以这样写正则表达式。
<strong>[</strong>root@allen1 ~]# echo "Hello, my name is aming."|grep -P '(?<=Hello, ).*(?= aming.)' Hello, my name is aming.
- ?<=字符串1:表示只匹配字符串1后面的内容
- ?= 字符串2:表示只匹配字符串2前面的内容
如果只需要匹配到的部分,还可以加上-o选项
<strong>[</strong>root@allen1 ~]# echo "Hello, my name is aming."|grep -Po '(?<=Hello, ).*(?= aming.)' my name is
使用xargs实现for循环(输出两列)
正常使用for循环,但只能输出成一列
[root@VM-0-10-centos ~]# for i in $(cat /etc/passwd|awk -F: '{print $1,$NF}');do echo $i;done root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown halt /sbin/halt mail /sbin/nologin operator /sbin/nologin games /sbin/nologin ftp /sbin/nologin nobody /sbin/nologin systemd-network /sbin/nologin dbus /sbin/nologin polkitd /sbin/nologin libstoragemgmt /sbin/nologin rpc /sbin/nologin ntp /sbin/nologin abrt /sbin/nologin sshd /sbin/nologin postfix /sbin/nologin chrony /sbin/nologin tcpdump /sbin/nologin syslog
使用xargs实现循环输出两列
[root@VM-0-10-centos ~]# cat /etc/passwd |awk -F: '{print $1,$NF}'|xargs -n2 bash -c 'echo $1 $2' cc root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown halt /sbin/halt mail /sbin/nologin operator /sbin/nologin games /sbin/nologin ftp /sbin/nologin nobody /sbin/nologin systemd-network /sbin/nologin dbus /sbin/nologin polkitd /sbin/nologin libstoragemgmt /sbin/nologin rpc /sbin/nologin ntp /sbin/nologin abrt /sbin/nologin sshd /sbin/nologin postfix /sbin/nologin chrony /sbin/nologin tcpdump /sbin/nologin syslog /bin/false lighthouse /bin/bash dockerroot /sbin/nologin
把两列的数据都作为单独变量循环输出
[root@VM-0-10-centos ~]# cat /etc/passwd |awk -F: '{print $1,$NF}'|xargs -n2 bash -c 'for i in $1;do for j in $2;do echo $i $j;done ;done' ff root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown halt /sbin/halt mail /sbin/nologin operator /sbin/nologin games /sbin/nologin ftp /sbin/nologin nobody /sbin/nologin systemd-network /sbin/nologin dbus /sbin/nologin polkitd /sbin/nologin libstoragemgmt /sbin/nologin rpc /sbin/nologin ntp /sbin/nologin abrt /sbin/nologin sshd /sbin/nologin postfix /sbin/nologin chrony /sbin/nologin tcpdump /sbin/nologin syslog /bin/false lighthouse /bin/bash dockerroot /sbin/nologin
注:末尾的ff为随机输入,为的是设定$0,及脚本自身,但这里并不需要,以及bash -c后面需要接‘,而不是”,因为”会把$1和$2识别成系统变量
实时监测文件夹内文件变动inotifywait
需要安装inotify
yum install -y inotify-tools

语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…] -m: 即“–monitor” 表示始终保持事件监听状态。 -r: 即“–recursive” 表示递归查询目录 -q: 即“–quiet” 表示打印出监控事件 -o: 即“–outfile” 输出事情到一个文件而不是标准输出 -s: 即“–syslog” 输入错误信息到系统日志 -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等 -format: 指定输出格式;常用的格式符如: %w:表示发生事件的目录 %f:表示发生事件的文件 %e:表示发生的事件 %Xe:事件以“X”分隔 %T:使用由-timefmt定义的时间格式 -timefmt:指定时间格式,用于-format选项中的%T格式
实时监控/var/log文件夹文件变动,且设置输出格式
[root@VM-0-10-centos log]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format "[%T] : [%e] : %w%f" /var/log

audit实时审计服务网络连接
- 创建审计规则(-k 为指定规则key)
auditctl -a always,exit -F arch=b64 -S socket,connect,sendmmsg,sendmsg,bind,recvmsg,close -k test
注解: socketcall socket系统调用 socket 建立socket bind 绑定socket到端口 connect 连接远程主机 accept 响应socket连接请求 send 通过socket发送信息 sendto 发送UDP信息 sendmsg 参见send recv 通过socket接收信息 recvfrom 接收UDP信息 recvmsg 参见recv listen 监听socket端口 select 对多路同步I/O进行轮询 shutdown 关闭socket上的连 getsockname 取得本地socket名字 getpeername 获取通信对方的socket名字 getsockopt 取端口设置 setsockopt 设置端口参数 sendfile 在文件或端口间传输数据 socketpair 创建一对已联接的无名socket
- 查看审计日志
日志位置:/var/log/audit/audit.log
root@VM-0-10-centos ~]# ausearch -k test ---- time->Wed Oct 12 17:24:14 2022 type=PROCTITLE msg=audit(1665566654.787:3475803): proctitle="barad_agent" type=SOCKADDR msg=audit(1665566654.787:3475803): saddr=02000050A9FE00040000000000000000 type=SYSCALL msg=audit(1665566654.787:3475803): arch=c000003e syscall=42 success=no exit=-115 a0=c a1=7fff18f19b70 a2=10 a3=4 items=0 ppid=1762 pid=1768 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid= 0 fsgid=0 tty=(none) ses=5 comm="barad_agent" exe="/usr/local/qcloud/monitor/python26/bin/python" key="test" ---- time->Wed Oct 12 17:24:14 2022 type=PROCTITLE msg=audit(1665566654.889:3475882): proctitle="barad_agent" type=SOCKADDR msg=audit(1665566654.889:3475882): saddr=02000050A9FE00040000000000000000 type=SYSCALL msg=audit(1665566654.889:3475882): arch=c000003e syscall=42 success=no exit=-115 a0=c a1=7fff18f19b70 a2=10 a3=4 items=0 ppid=1762 pid=1768 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid= 0 fsgid=0 tty=(none) ses=5 comm="barad_agent" exe="/usr/local/qcloud/monitor/python26/bin/python" key="test"
sed命令实现在文件中取多个参数值
假如有如下数据,想要取domain,port,Password的值,并且只取第一个,要如何实现呢?
{"Duration":"2ffff","Data":{"domain":"xxx.xxx.com","port":18733,"userList":[{"ID":2,"Username":"aaa","Password":"abcdefg==","EncryptPass":"9a1717dafdafda6716a130f3d5f91320b91d74aefdc3aaaf","Quota":85899345920,"Download":54948906599,"Upload":1155713256,"UseDays":0,"ExpiryDate":""},{"ID":3,"Username":"fff","Password":"12345678","EncryptPass":"ad598156e5afadadf86b1c632609df6ee628611d66ee3567819c5ab91307ba","Quota":53687091200,"Download":2281521385,"Upload":73704813,"UseDays":0,"ExpiryDate":""},{"ID":4,"Username":"bbb","Password":"fffaefwe","EncryptPass":"6fb8b743165dfadfefe41d877942fd5ace1c241c70a79248e53209cd57aaf934","Quota":53687091200,"Download":4730791904,"Upload":23340061,"UseDays":0,"ExpiryDate":""}
首先,以“ : , 为分隔符,并将其替换为空
cat tt.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g' | sed -rn '/domain|port|Password/{n; p}' | head -3 | xargs cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' [root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' { Duration 2ffff Data { domain xxx.xxx.com port 18733 userList [{ ID 2 Username aaa Password abcdefg== EncryptPass 9a1717dafdafda6716a130f3d5f91320b91d74aefdc3aaaf Quota 85899345920 Download 54948906599 Upload 1155713256 UseDays 0 ExpiryDate } { ID 3 Username fff Password 12345678 EncryptPass ad598156e5afadadf86b1c632609df6ee628611d66ee3567819c5ab91307ba Quota 53687091200 Download 2281521385 Upload 73704813 UseDays 0 ExpiryDate } { ID 4 Username bbb Password fffaefwe EncryptPass 6fb8b743165dfadfefe41d877942fd5ace1c241c70a79248e53209cd57aaf934 Quota 53687091200 Download 4730791904 Upload 23340061 UseDays 0 ExpiryDate }
其次去除多余空格,并将其替换为换行符
[root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g' { Duration 2ffff Data { domain xxx.xxx.com port 18733 userList [{ ID 。 。 。 。 0 ExpiryDate } { 0 ExpiryDate }
最后正则匹配domain port password 并取匹配行的下一行(这里有个bug,会取所有密码,贪婪匹配)
[root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g' | sed -rn '/domain|port|Password/{n; p}' xxx.xxx.com 18733 abcdefg== 12345678 fffaefwe