关于我工作环境的信息:
$ uname -a
AIX prd231 1 6 00C6B1F74C00
$ oslevel -s
6100-03-10-1119
代码块 A
( grep schdCycCleanup $DCCS_LOG_FILE | sed 's/[~]/ \
/g' | grep 'Move(s) Exist for cycle' | sed 's/[^0-9]*//g' ) > cycleA.txt
代码块 B
( grep schdCycCleanup $DCCS_LOG_FILE | sed 's/[~]/ \n/g' | grep 'Move(s) Exist for cycle' | sed 's/[^0-9]*//g' ) > cycleB.txt
我有两个代码块(如上所示)使用 sed 将输入缩减为 6 位数字,但其中一个命令的行为与我预期的不同。
两个代码块的输入示例
Mar 25 14:06:16 prd231 ajbtux[33423660]: 20160325140616:~schd_cem_svr:1:0:SCHD-MSG-MOVEEXISTCYCLE:200705008:AUDIT:~schdCycCleanup - /apps/dccs/ajbtux/source/SCHD/schd_cycle_cleanup.c - line 341~ SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210~
当上面的示例输入通过两个代码块时,我得到以下输出。
cycleA.txt内容
389210
cycleB.txt内容
25140616231334236602016032514061610200705008341389210
我知道我的最后一个管道 sed 命令 (sed 's/[^0-9]*//g') 正在删除除数字以外的所有字符,所以我从 block 代码中省略了它并将输出放在另外两个文件。我得到以下输出。
cycleA1.txt内容
SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210
cycleB1.txt内容
Mar 25 15:27:58 prd231 ajbtux[33423660]: 20160325152758: nschd_cem_svr:1:0:SCHD-MSG-MOVEEXISTCYCLE:200705008:AUDIT: nschdCycCleanup - /apps/dccs/ajbtux/source/SCHD/schd_cycle_cleanup.c - line 341 n SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210 n
我可以看到第一个代码块正在删除除 (SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210) 之外的所有内容并使用波浪号,但第二个代码块只是用字符 n 替换波浪号。我还可以看到在 this(sed 's/[~]/) 之后的第一个代码块中有必要换行,这就是为什么我虽然有\n 会模拟换行但事实并非如此。我认为我不同的输出结果是因为正则表达式的使用方式。我试图研究正则表达式并在 stackoverflow 上搜索它们,但没有得到我想要的东西。有人可以解释我如何从代码块 B 获得与代码块 A 相同的结果,而无需将我的部分代码放在第二行吗?
提前致谢
最佳答案
这是 XY 问题 (http://xyproblem.info/) 的示例。您正在寻求帮助来实现某些对您的问题来说是错误的解决方案。为什么要将 ~
更改为换行符等,而在给定发布的示例输入和预期输出的情况下,您只需要:
$ sed -n 's/.*schdCycCleanup.* \([0-9]*\).*/\1/p' file
389210
或:
$ awk -F'[ ~]' '/schdCycCleanup/{print $(NF-1)}' file
389210
如果这不是您需要的全部,那么请编辑您的问题以阐明您对WHAT 的要求(而不是您尝试做的方式),因为您当前的方法只是错了。
关于regex - 下面的两个 sed 命令有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227417/