中for循环修改样式_LINUX中的grep命令、for循环以及使⽤
SHELL脚本批量检查。。。
⼤家都知道,我们临床数据分析的主⼒⼲将是SAS,SAS的主要功能是数据的清理和分析,是我们⼯作之本,但是,灵活使⽤⼀些其他的编程软件可以让计算机代替我们批量运⾏⼀些重复的操作,极⼤地提⾼⼯作效率。
所以Bunny今天就给⼤家介绍LINUX中的grep命令和for循环,这两个简单的命令可以帮助我们⾮常快捷地批量检查SAS log。
1. grep命令
grep命令是LINUX中的⼀种强⼤的⽂本搜索⼯具,它使⽤正则表达式搜索指定⽂本。⼤家可以把它类⽐为SAS中的prxmatch函数,与prxmatch函数不同的是,grep在搜索到指定⽂本后,可以同时输出指定⽂本所在的⾏。
grep命令的格式为:
grep [参数]
常⽤参数:
-i 忽略⼤⼩写
-o 只输出匹配到的部分,⽽⾮整个⾏
-v 反向选择,即输出没有没有匹配到的⾏
-E 同时匹配多个关键字/字符串
-n 在输出内容前加上对应⾏号
grep命令的基本格式就是这么简单,接下来,让我们⽤⼏个简单的例⼦试⼀试吧。Bunny使⽤的软件是mobaXterm。
linux循环执行命令脚本查询对象是⼀个如下图所⽰的⽂件。
⾸先使⽤cd命令进⼊所要查询的⽂件存放的⽂件夹。
接下来使⽤grep命令查询⽂件中是否有error这个单词。
运⾏结果如下:
LINUX到了⽂件中的单词“ERROR”,并输出了其所在⾏的所有⽂本。
让我们试试查⼩写的单词“error”:
这次LINUX没有返回任何结果,即表⽰⽂件中并没有单词“error”。
我们可以通过加上参数i来忽略⼤⼩写,加上n来同时输出⾏号,加上o来只输出匹配到的内容。
此时的输出结果如下:
成功匹配到单词“ERROR”,并且输出⾏号+匹配到的⽂本。
在我们检查SAS log时,往往要同时匹配多个⽂本,此时要⽤到grep命令的参数 -E 和正则表达式的元字符 | ,参数 -E ⽤来同时匹配多个关键字/字符串,元字符 | ⽤来将多个匹配条件⽤“或者”连接起来。grep命令如下图所⽰:
此时可以同时查询⽂本“Invalid”和⽂本“Format was too small”,输出结果如下图所⽰:
我们还可以使⽤“>>”命令将输出重定向到⼀个⽂件中,如:
打开⽂件夹中的⽂件,就可以看到我们查询到的关键⽂本。
怎么样,grep命令是不是很简单。学到这⾥,我们就掌握了使⽤SHELL脚本检查SAS log的基本命令。
有的同学就要说了,这⽤grep命令也没⽐我在SAS⾥直接CTRL+F简单呀。是的,在检查单个⽂件时,LINUX并没有显⽰出它的优势,我们还需要⼀个⼩帮⼿来实现SAS log的批量查询,那就是for循环。
2. for循环
for循环的基本格式如下:
for X in XXX
do
command1
command2
...
commandN
done
和SAS⾥的do循环是很类似的,第⼀⾏的for语句决定了循环的对象和次数,即遍历XXX中的所有X,接下来对每⼀个X都执⾏do和done 之间的命令。
检查SAS log时,我们所要进⾏的操作是遍历⽂件夹内的所有log⽂件,我们使⽤通配符*来匹配⽂件夹中的所有⽂件名,加上后缀.log就可以匹配出⽂件夹中的所有log⽂件,然后在do和done之间,写上grep命令,对每⼀个log⽂件都执⾏grep命令,如下图所⽰:
${i}代表每次循环时对应的log⽂件名,此时LINUX会输出⽂件夹中所有log⽂件的包含grep命令中关键⽂本的⾏。如:
此时,我们就做到了批量查询。但是每次都写这么⼤⼀段命令,未免有些太⿇烦了,这时⼤家是不是想到了SAS中的宏程序呢?同样,在LINUX中,我们也可以将⼀段LINUX命令封装成⼀个⽂件,通过调⽤这个⽂件以及赋予⽂件参数来执⾏其中的LINUX命令,这就是SHELL 脚本。
3. SHELL脚本
和SAS中的宏程序⼀样,SHELL脚本也是有参数的,这些参数在脚本⽂件内部可以使⽤$n的形式来接收。如,${1}代表第⼀个参数,${2}代表第⼆个参数。${0}是⼀个特殊的参数,它代表当前脚本的⽂件名。
⾸先,我们编辑如下图所⽰的⼀个SHELL脚本:
其中的${1}就是我们调⽤时可以输⼊的参数,下⾯我们来调⽤这个SHELL脚本:
⽤bash命令调⽤check_log.sh⽂件,输⼊的参数为,即将grep命令的结果输出重定向到⽂件中,下⾯是运⾏完成后的⽂件部分内容。
此时我们的批量检查SAS log的SHELL脚本就初具雏形了,但是细⼼的同学可能会发现我们的脚本还有⼀个⼩问题,结果⽂件中的输出只有在原⽂件中的⾏号,⽽没有具体的⽂件名,我们⽆法从结果⽂
件中得到每⼀条issue log对应的是哪⼀个log⽂件。
为了解决这个问题,我们可以在每次输出issue log之前,使⽤echo命令输出查询的⽂件名,并重定向到汇总log的⽂件中,⽤于提⽰后⾯查询到的issue log的来源。如下图所⽰:
此时我们的结果为:
此时我们的SHELL脚本就可以⽅便快捷地批量查询SAS log,并将⽂件名,⾏号以及关键词所在⾏内容输出到指定⽂件中,⽅便我们对每⼀条issue log进⾏定位啦。
通过今天的分享,⼤家有没有发现我们的⼯作⼩助⼿并不是只有SAS呢,其实,不仅仅是SHELL脚本,其他的编程软件,如
python,VBA,R,都可以在某些⽅⾯极⼤地提⾼我们的⼯作效率,解放双⼿呢。所以,⼀定不要只是埋头在SAS⾥,⼯作之余,学学其他软件,可能会有意想不到的收获!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论