Linux 字符串操作



我有一个文件,该文件包含以下日志,有时它发生了变化,但部分总是有文件。 我想提取该文件名最多.xls

cat /pretupsvar/pretups_weblogs/DirectPayOutErrorLog.log | awk '{print $10}'| sed 's/]//g'

当文件名没有空格时,它显示正常,如下面的日志所示

 userList1305631236859_AS_ALL_DIST_ALL_ETOPUP_1305631236859.xls

文件,但是当文件名包含一些空格时,它会获取该空间,例如

userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week

但是在PB的情况下,我需要正确格式的文件名。

有没有解决方案可以解决这个问题

我希望这个输出在空格大小写中::

userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls 

以便我可以将该文件移动到另一个位置。如果它不包含空格,则最多只能提供 .xls 个文件名。

日志是 :::INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9854798391] [文件名: userList1305631236859_AS_ALL_DIST_ALL_ETOPUP_1305631236859.xls] [消息: 用户不活动] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9854803938] [文件名: userList1305631236859_AS_ALL_DIST_ALL_ETOPUP_1305631236859.xls] [消息: 此手机号码不存在频道用户] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803493705] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week One Payout.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803493706] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week One Payout.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803493707] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week One Payout.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803590276] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week 一次付款.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803590277] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week 一次付款.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803590802] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week One Payout.xls] [消息: 用户不属于指定域] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: NA] [文件名: userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week One Payout.xls] [消息: SQL 异常:列索引无效] INFO [main] (DirectPayOutErrorLog.java:113) - :: [MSISDN: 9803594351] [文件名: userList1305647896930_PB_PBZONE_DLMP_RLMP_ETOPUP_Week 一次付款.xls] [消息: 用户不属于指定域]

请帮忙

试试这个:

sed -n -e 's/.*[FILE NAME: ([^]]*)].*/1/p' /pretupsvar/pretups_weblogs/DirectPayOutErrorLog.log

没有必要"手动"转义空格,只要您在每次使用文件名时正确引用用于存储文件名的变量(假设您正在谈论 shell 脚本)。

如果要对每个实例的每个文件名执行操作,可以执行以下操作:

INPUT_FILE=/pretupsvar/pretups_weblogs/DirectPayOutErrorLog.log
sed -n -e 's/.*[FILE NAME: ([^]]*)].*/1/p' $INPUT_FILE | while read file ; do
  mv "$file" $SOME_DESTINATION
done

如果只想对每个文件执行一次操作,可以轻松地将sort -u添加到此管道中:

sed -n -e 's/.*[FILE NAME: ([^]]*)].*/1/p' $INPUT_FILE | sort -u | while read file ; do
  // do stuff with "$file"
done

另一种方法:

$ cut -s -f12,13,14 -d " " --output-delimiter=' ' log | sed 's#].*$##'
userList1305631236859_AS_ALL_DIST_ALL_ETOPUP_1305631236859.xls
userList1305631236859_AS_ALL_DIST_ALL_ETOPUP_1305631236859.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647880920_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls
userList1305647896930_PB_PBZONE_DLMP_RLMP_ETOPUP_Week one payout.xls

如果您的文件名不包含"]",则您只需要:

sed 's/.*FILE NAME: //;s/].*//;s/ /\ /g' logfile

否则搜索] [MESSAGE: