配置管理中经常要遇到服务器配置一致性检查的问题,在Linux下办公的我已经熟知方法
for file in `某个删选命令`
do
某个截取命令(利用循环中的变量file)
done
如下
teraterm同时向三个窗口广播命令截取后五行输出


那如果没有bash环境的windows呢?(请自动忽略我装的git bash)
用powershell
PS C:\Users\Administrator\Desktop\logdir> ls|Where-Object {$_.Name -match "05-02-23-43"}| ForEach-Object {write-host $_.Name;gc $_.Name|select-object -last 5}
amainst-2018-05-02-23-43.log
[vagrant@amainst ~]$ uname -n;date;echo "nimabi"
amainst
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@amainst ~]$
anodest01-2018-05-02-23-43.log
[vagrant@anodest01 ~]$ uname -n;date;echo "nimabi"
anodest01
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@anodest01 ~]$
anodest02-2018-05-02-23-43.log
[vagrant@anodest02 ~]$ uname -n;date;echo "nimabi"
anodest02
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@anodest02 ~]$
分析一下
ls和bash的ls差不多,不过输出比较详细(多余)
PS C:\Users\Administrator\Desktop\logdir> ls
目录: C:\Users\Administrator\Desktop\logdir
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2018/3/5 22:20 3661 192.168.8.81-2018-03-05-21-48.log
-a---- 2018/3/5 22:47 113 192.168.8.81-2018-03-05-22-45.log
-a---- 2018/3/5 23:58 90 192.168.8.81-2018-03-05-23-23.log
-a---- 2018/3/6 0:00 240 192.168.8.81-2018-03-05-23-59.log
-a---- 2018/3/5 22:20 1653 192.168.8.82-2018-03-05-21-49.log
-a---- 2018/3/5 22:47 92 192.168.8.82-2018-03-05-22-45.log
-a---- 2018/3/5 23:58 92 192.168.8.82-2018-03-05-23-23.log
-a---- 2018/3/6 0:00 246 192.168.8.82-2018-03-05-23-59.log
-a---- 2018/3/5 22:20 5265 192.168.8.83-2018-03-05-21-56.log
-a---- 2018/3/5 22:47 92 192.168.8.83-2018-03-05-22-45.log
-a---- 2018/3/5 23:58 92 192.168.8.83-2018-03-05-23-23.log
-a---- 2018/3/6 0:00 392 192.168.8.83-2018-03-05-23-59.log
-a---- 2018/5/2 23:58 2966 amainst-2018-05-02-23-43.log
-a---- 2018/5/2 23:58 1186 anodest01-2018-05-02-23-43.log
-a---- 2018/5/2 23:58 1968 anodest02-2018-05-02-23-43.log
PS C:\Users\Administrator\Desktop\logdir>
Where-Object {$_.Name -match "05-02-23-43"}
相当于bash的awk '{if($NF~"05-02-23-43")print $NF}'
就是说Name这个域里带有05-02-23-43这个关键字的匹配
PS C:\Users\Administrator\Desktop\logdir> ls|Where-Object {$_.Name -match "05-02-23-43"}
目录: C:\Users\Administrator\Desktop\logdir
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2018/5/2 23:58 2966 amainst-2018-05-02-23-43.log
-a---- 2018/5/2 23:58 1186 anodest01-2018-05-02-23-43.log
-a---- 2018/5/2 23:58 1968 anodest02-2018-05-02-23-43.log
PS C:\Users\Administrator\Desktop\logdir>
最后把筛选出来的文件作为对象处理
ForEach-Object {write-host $_.Name;gc $_.Name|select-object -last 5}
处理方式是每次打印出文件名,write-host $_.Name
gc是相当于bash的cat,全名是Get-Content
管道|Select-Object -Last 5是后5行
这样我就知道我同时对这三台服务器输出的命令得到的结果是不是一致的,顺利抓到二五仔
PS C:\Users\Administrator\Desktop\logdir> ls|Where-Object {$_.Name -match "05-02-23-43"}| ForEach-Object {write-host $_.Name;gc $_.Name|select-object -last 5}
amainst-2018-05-02-23-43.log
[vagrant@amainst ~]$ uname -n;date;echo "nimabi"
amainst
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@amainst ~]$
anodest01-2018-05-02-23-43.log
[vagrant@anodest01 ~]$ uname -n;date;echo "nimabi"
anodest01
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@anodest01 ~]$
anodest02-2018-05-02-23-43.log
[vagrant@anodest02 ~]$ uname -n;date;echo "nimabi"
anodest02
Wed May 2 15:58:35 UTC 2018
nimabi
[vagrant@anodest02 ~]$
powershell的cmdlet还是挺烦的(因为长),毕竟对于很多运维来说,Linux的bash才是日常工作中经常使用的系统。但是powershell由于是面向对象的,某些写法上要优于bash。(前提是你熟)
但是,要知道windows的工作台又是你办公的主要战场。如果因为公司的安全限制无法安装虚拟机linux os或者git bash等额外cli。
那powershell研究一下还是对工作有很大帮助的
一句话总结就是,遇人说人话,遇鬼说鬼话,不要因为自己经常使用某些环境突然变了,而变得怨天尤人。
虽然说他人即是地狱
网友评论