我正在尝试将多行egrep查询的输出格式化为CSV兼容格式。
我需要从一个很大的文件列表中抓取一些值(其中一些可能不包含我要查找的值)
我使用的grep命令是:
grep -e Name -e Type -e Schedule -e Pool -e Storage \*|awk -F' = ' '{print $1,$2}'|sort
这将返回如下输出:
IRVLinuxDefault.cfg: Name "IRVLinuxDefault"
IRVLinuxDefault.cfg: Pool "IRV_DD890_Full60"
IRVLinuxDefault.cfg: Schedule "IRV_Backups"
IRVLinuxDefault.cfg: Storage "IRV_SD_DD890"
IRVLinuxDefault.cfg: Type "Backup"
LVS_60Day_NDMP_Defs.cfg: Name "LVS_60Day_NDMP_Defs"
LVS_60Day_NDMP_Defs.cfg: Pool "LVS_DD_AV_NDMP"
LVS_60Day_NDMP_Defs.cfg: Schedule "LVS_NDMP_Monthly"
LVS_60Day_NDMP_Defs.cfg: Storage "LVS_SD_DD990_AV_NDMP"
LVS_60Day_NDMP_Defs.cfg: Type "Backup"
LVS_60Day_NDMP_NOFileSet_Defs.cfg: Name "LVS_60Day_NDMP_NOFileSet_Defs"
LVS_60Day_NDMP_NOFileSet_Defs.cfg: Pool "LVS_DD_AV_NDMP"
LVS_60Day_NDMP_NOFileSet_Defs.cfg: Schedule "LVS_NDMP_Monthly"
LVS_60Day_NDMP_NOFileSet_Defs.cfg: Storage "LVS_SD_DD990_AV_NDMP"
LVS_60Day_NDMP_NOFileSet_Defs.cfg: Type "Backup"
LVS_Datalake2_Defs.cfg: Name "LVS_Datalake2_Defs"
LVS_Datalake2_Defs.cfg: Pool "LVS_WAS_SD101_13Mo-cloud"
LVS_Datalake2_Defs.cfg: Schedule "WeeklyCycle"
LVS_Datalake2_Defs.cfg: Storage "LVS_WAS_SD101_13Mo-cloud"
LVS_Datalake2_Defs.cfg: Type "Backup"
我尝试以以下格式输出这些值字段:FILE,NAME,NAME,POOL,SCHEDULE,STORAGE,TYPE每列都有一个列标题。如果其中一个文件不包含grepped for值,我希望在该空间输出一个空记录。
输出I * want * 看起来像csv(示例如下),去掉了任何""或:""(注意,所需输出的3底行缺少Pool字段,因此有2个逗号保留空单元格):
FILE,NAME,POOL,SCHEDULE,STORAGE,TYPE
IRVLinuxDefault.cfg,IRVLinuxDefault,IRV_DD890_Full60,IRV_Backups,IRV_SD_DD890,Backup
LVS_60Day_NDMP_Defs.cfg,LVS_DD_AV_NDMP,LVS_NDMP_Monthly,LVS_SD_DD990_AV_NDMP,Backup
LVS_60Day_NDMP_NOFileSet_Defs.cfg,,LVS_NDMP_Monthly,LVS_SD_DD990_AV_NDMP,Backup
我已经尝试了awk、sed、GNU datamash(转置)的多种方法,但没有什么运气。
有什么建议吗?
一个三个一个x一个四个一个x一个五个一个x一个六个一个
2条答案
按热度按时间v9tzhpje1#
对于未提供预期值的情况,此脚本 * 将允许您指定*要替换的字符串。
它还可以适应环境,并允许您指定分隔符(用于输入)以提取所需的变量值。
注意:由于与awk语法冲突,您不能使用单引号/双引号作为split函数的分隔符,因此我在您提供的输入和将其转换为所需输出的脚本之间使用了sed。
输出如下所示:
hiz5n14c2#
一旦
awk
成为解决方案的一部分,通常就不需要grep
了。将OP的
grep|awk|sort
输出逆向工程到一些示例文件中:一个
awk
创意:这将产生: