【问题标题】:Grepping a specific string from a file in script从脚本中的文件中提取特定字符串
【发布时间】:2015-11-09 05:18:04
【问题描述】:

我有以下文件:(一个示例文件,文件名:2015_09_22_processedPartnumList.txt,位置:/a/b/c/itemreport)

DataLoader_trace_2015_09_22_02_01_32.0956.log:INFO: 2015-09-22
Data Processing Starts : 12345678

我只想从文件 /a/b/c/d/ids_date +%d_%m_%Y_%H_%M_%S 中获取上述文件中的所有 id,即 12345678 ....(每个 id 在单独的行中,而不是逗号分隔)。日志

我已经编写了以下脚本,但我得到的文件是空的。没有显示任何异常或任何东西。因此,我很难识别错误。请告诉我脚本中有什么问题。

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 被复制到新文件中。

【问题讨论】:

    标签: bash file shell unix grep


    【解决方案1】:

    如果你的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
    

    【讨论】:

    • 对不起,我没看懂 '.*:\s\K\d+$' ,请尽可能简单解释一下。另外,这部分是否正确:date "+%Y_%m_%d"_processedPartnumList.txt,因为我主要怀疑这个日期。
    • 请再看一遍编辑过的问题,我没有像你用 grep 和 PCRE 那样得到零件号。
    • @tanmay2507 好像你的 grep 不支持 PCRE,你用的是哪个操作系统?
    • Mac OSX Yosemite,版本 10.10.5
    • @tanmay2507 hmmm...此解决方案将不起作用,因为 Mac 的默认 grep 不支持 PCRE..您可以安装 GNU grep 以启用 PCRE grep..
    【解决方案2】:

    这不是很好的解决方案,但它确实有效。

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

    【讨论】:

    • ..... O 14515220\ O 13982787\ O 46795670\ O 46795672\ O 46795675\ O 46795679\ O 10001857\ } 我得到这个作为我的输出。那么,为什么我到处都是这个“O”,有什么方法可以提取数字部分并删除每个零件号后的“/”。
    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 2012-03-30
    • 2020-04-26
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多