![根据匹配模式将文件内容提取到多个文件中](https://linux22.com/image/1408870/%E6%A0%B9%E6%8D%AE%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F%E5%B0%86%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E6%8F%90%E5%8F%96%E5%88%B0%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD.png)
我是 unix 新手。我想处理这个文件。
PP_NAME_1
jprovider|J Driver Provider|${J_DRIVER_PATH}/jcc;${J_DRIVER_PATH}/jcc_license_cu|${J_DRIVER_NATIVEPATH}|com.jcc.Connection
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_ias|chuchchu|password|CHCHCH|4|serverName|portNumber
save
PP_NAME_2
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
save
PP_NAME_3
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
Alias|461bdhk_host|123.45.67.89|10000
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_s|chuchchu|password|CHCHCH|4|serverName|portNumber
Variable|J_DRIVER_PATH|
save
PP_NAME_4
classPath|/mm/ja/lib
Variable|J_DRIVER_PATH|
save
我想提取匹配模式 PP_NAME_1 旁边的行,首先将模式保存到 FILE1 中
然后将匹配模式 PP_NAME_2 的下一行与第二个保存模式一起保存到 FILE2 中,依此类推。
原始文件中不会有空行。
您将观察到每个文件的行数有所不同。
FILE1 将有 3 行
FILE2 将有 5 行
FILE3 将有 8 行
和
FILE4 将有 3 行。
所以,每次的线路都会有所不同,可能会有超过 50 条线路。
答案1
使用awk
withPP_NAME_
作为记录分隔符:
awk -v RS='PP_NAME_' -v FS='\n' '/./ {print | "tail -n +2 >FILE"$1}' input
awk
每次读入一条“记录”,并将每条记录划分为“字段”。在这种情况下,用户RS='PP_NAME_'
将记录定义为直到字符 的下一个实例为止的所有文本PP_NAME_
。字段分隔符FS
等于一个新行。这意味着每行都是一个“字段”。按照这种方式定义,每条记录都以一行开头,其中包含我们要将记录写入的文件的编号。将记录实际写入文件的操作如下:print | "tail -n +2 >FILE"$1
。由于$1
是第一行上剩余的编号,"FILE"$1
是我们要写入的输出文件的名称。我们希望将记录中的所有内容写入该文件除了第一个有数字的行。使用 shell 命令tail -n +2
可以删除第一行。
读入的第一条记录是第一次出现 之前的所有文本PP_NAME_
。这意味着读入的第一条记录是空的。由于我们不想写出它,因此将正则表达式/./
放在print
命令之前。此正则表达式匹配任何非空记录。这意味着它消除了我们不想要的空记录。