问题描述
运行命令后
find . -name \"R*VER\" -mtime +1 -exec sh -c \'grep -H ^err \"{}\" || echo \"{}:No error\"\' \\;
我的档案看起来像这样
RRR1~COS~COSMETICS~40048~jgmdtv113~1~P~R22-200~029053662549~20110607~102151.VER No error
RRR1~COS~COSMETICS~ETT03~jgm14652.~3~F~R16-500~000907009757~20110607~085109.VER err 3922
使用波浪号(〜)作为文件名中的定界符,我可以提取所需的字段,以便得到这样的输出吗?
RRR1~COS~COSMETICS~40048~jgmdtv113~1~P~R22-200~029053662549~20110607~102151.VER No error RRR1 COS P
RRR1~COS~COSMETICS~ETT03~jgm14652.~3~F~R16-500~000907009757~20110607~085109.VER err 3922 RRR1 COS F
我尝试了以下
find . -name \"R*VER\" -mtime +1 -exec sh -c \'grep -H ^err \"{}\" || echo \"{}:No error\"\' \\;|awk -F~ \'{print $0}{print $1\"\\t\"$2\"\\t\"$7\"\\t\"$8\"\\t\"$9\"\\t\"$10}\'
但它不起作用;相反,它将产生此输出(并非此处显示所有字段...)
RRR1~COS~COSMETICS~40048~jgmdtv113~1~P~R22-200~029053662549~20110607~102151.VER No error
RRR1~COS~COSMETICS~40048~jgmdtv113~1~P~R22-200~029053662549~20110607~102151.VER RRR1 COS P
RRR1~COS~COSMETICS~ETT03~jgm14652.~3~F~R16-500~000907009757~20110607~085109.VER err 3922
RRR1~COS~COSMETICS~ETT03~jgm14652.~3~F~R16-500~000907009757~20110607~085109.VER RRR1 COS F
我想这样做是一回事,所以我可以用INSERT语句生成一个sql脚本...可以吗?
解决方法
您应该只使用一个操作即可打印所有内容:
awk -F~ {print $0 \" \" $1 \" \" $2 \" \" ...}
, 在帮助下,这是我得到的:
find . -name \"R*VER\" -exec sh -c \'grep -H ^err \"{}\" || echo \"{}:No error\"\' \\; |
awk -F: \'
BEGIN { q=\"\\047\" }
{
file=$1
result=$2
sub(/^.*\\//,\"\",file)
split(file,a,/~/)
print \"INSERT INTO MYTABLE (COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8) VALUES (\" q file q \",\" q result q \",\" q a[1] q \",\" q a[2] q \",\" q a[7] q \",\" q a[8] q \",\" q a[9] q \",\" q a[10] q \")\"
}\'
效果很好。感谢您抽出宝贵的时间。