Bash 从脚本中的文件中重新映射特定字符串

Bash 从脚本中的文件中重新映射特定字符串,bash,file,shell,unix,grep,Bash,File,Shell,Unix,Grep,我有以下文件:(文件名为:2015_09_22_processedPartnumList.txt的示例文件,位置:/A/b/c/itemreport) 我只想从上面的文件中获取所有ID,即12345678。。。。(每个id在单独的行中,不以逗号分隔)在文件/a/b/c/d/id\uCode>date+%d\u%m\u%Y\u%H\u%m\u%S中 我已经写了下面的脚本,但是我得到的文件是空的。没有任何例外或任何事情。因此,我很难识别错误。请告诉我脚本中有什么错误 LOGDIR=/a/b/logd

我有以下文件:(文件名为:2015_09_22_processedPartnumList.txt的示例文件,位置:/A/b/c/itemreport)

我只想从上面的文件中获取所有ID,即12345678。。。。(每个id在单独的行中,不以逗号分隔)在文件/a/b/c/d/id\uCode>date+%d\u%m\u%Y\u%H\u%m\u%S中

我已经写了下面的脚本,但是我得到的文件是空的。没有任何例外或任何事情。因此,我很难识别错误。请告诉我脚本中有什么错误

LOGDIR=/a/b/logdir

tr=`date +%p`
echo $tr
if [ $tr = "PM" ];
then
    date=`date +%Y-%m-%d`
    echo "considering today's date for grepping logs"
else
    date=`date -d '1 day ago' +%Y-%m-%d`
    echo "considering yesterday's date for grepping logs as job run is delayed"
fi

ITEM_FILE=/a/b/c/d/ids_`date +%d_%m_%Y_%H_%M_%S`.log

在PCRE中实现grep后,我得到了这个信息,并且没有任何ID被复制到新文件中。

如果您的
grep
支持PCRE,您可以执行以下操作:

grep -Po '.*:\s\K\d+$' /a/b/c/itemreport/2015_09_22_processedPartnumList.txt \
      >/apps/feeds/out/catalog/ItemPartnumbers_"$(date '+%d_%m_%Y_%H_%M_%S')".log
  • *:\s
    将匹配到
    之后的空格,
    \K
    将放弃匹配

  • \d+$
    将匹配我们所需的部分,即直到行尾的数字

示例:

% grep -Po '.*:\s\K\d+$' 2015_09_22_processedPartnumList.txt \
                       >ItemPartnumbers_"$(date '+%d_%m_%Y_%H_%M_%S')".log

% cat ItemPartnumbers_09_11_2015_11_30_49.log 
13982787
14011550
13984790
13984791
14176509
14902623
14924193
14924194
13982787
46795670
46795671

如果您的
grep
支持PCRE,您可以执行以下操作:

grep -Po '.*:\s\K\d+$' /a/b/c/itemreport/2015_09_22_processedPartnumList.txt \
      >/apps/feeds/out/catalog/ItemPartnumbers_"$(date '+%d_%m_%Y_%H_%M_%S')".log
  • *:\s
    将匹配到
    之后的空格,
    \K
    将放弃匹配

  • \d+$
    将匹配我们所需的部分,即直到行尾的数字

示例:

% grep -Po '.*:\s\K\d+$' 2015_09_22_processedPartnumList.txt \
                       >ItemPartnumbers_"$(date '+%d_%m_%Y_%H_%M_%S')".log

% cat ItemPartnumbers_09_11_2015_11_30_49.log 
13982787
14011550
13984790
13984791
14176509
14902623
14924193
14924194
13982787
46795670
46795671

这不是一个很好的解决方案,但它是有效的

cat your\ file | cut -d ':' -f2-2 | tr -d INFO

这不是一个很好的解决方案,但它是有效的

cat your\ file | cut -d ':' -f2-2 | tr -d INFO

对不起,我不理解“*:\s\K\d+$”,如果可能,请简要解释一下。另外,这部分是否正确:
date“+%Y\u%m\u%d”
\u processedPartnumList.txt,因为我主要怀疑的是这个日期。请再次查看编辑后的问题,我没有像您使用带PCRE的grep那样获得零件号。@tanmay2507您的grep似乎不支持PCRE,您使用的是哪个操作系统?Mac OSX Yosemite,版本10.10。5@tanmay2507嗯……由于Mac默认的
grep
不支持PCRE,因此此解决方案将无法工作。您可以安装GNU grep以启用PCRE
grep
。抱歉,但我不理解“*:\s\K\d+$”,如果可能,请简要解释。另外,这部分是否正确:
date“+%Y\u%m\u%d”
\u processedPartnumList.txt,因为我主要怀疑的是这个日期。请再次查看编辑后的问题,我没有像您使用带PCRE的grep那样获得零件号。@tanmay2507您的grep似乎不支持PCRE,您使用的是哪个操作系统?Mac OSX Yosemite,版本10.10。5@tanmay2507嗯……由于Mac的默认
grep
不支持PCRE,因此此解决方案无法工作。您可以安装GNU grep以启用PCRE
grep
。。。。。。。O 14515220\O 13982787\O 46795670\O 46795672\O 46795675\O 46795679\O 10001857\}我将此作为我的输出。那么,为什么我到处都有这个“O”,有没有办法只提取数字部分并删除每个零件号后面的“/”。。。。。。O 14515220\O 13982787\O 46795670\O 46795672\O 46795675\O 46795679\O 10001857\}我将此作为我的输出。那么,为什么我到处都有这个“O”,有没有办法只提取数字部分并删除每个零件号后面的“/”。