【问题标题】:Shell command to copy and paste specific text from one file to another用于将特定文本从一个文件复制并粘贴到另一个文件的 Shell 命令
【发布时间】:2016-09-19 08:00:26
【问题描述】:

Shell 命令将特定文本从一个文件复制并粘贴到另一个文件?

输入文件

DIRECTOR> TM_6000 Source Load Summary.
DIRECTOR> CIN_1740 Table: [SQ_BOX_CONTROL] (Instance Name: [SQ_BOX_CONTROL])
Output Rows [1], Affected Rows [1], Applied Rows [1345], Rejected Rows [0]
DIRECTOR> TM_6001 Target Load Summary.
DIRECTOR> CIN_1740 Table: [JBOX_CONTROL] (Instance Name: [JBOX_CONTROL])
Output Rows [1], Affected Rows [1], Applied Rows [1340], Rejected Rows [0]
DIRECTOR> TM_6023
===================================================

DIRECTOR> TM_6020 Session [s_m_CONTROL] completed at [Tue Sep 15 02:49:12 2015].

需要以下格式的输出

Session : s_m_CONTROL
Source : 1345
Target : 1340

【问题讨论】:

  • 你的问题不清楚。首先,我认为您的真正意思不是复制和粘贴,因为这个术语在这里没有多大意义,而是从文本文件中提取信息。其次,我不明白您在什么条件下将 1345 关联到 Source 并将 1340 关联到 Target,但总的来说,您的问题归结为从文本文件中提取某些信息.如果您真的想要只使用 shell 编程,则需要指定要使用的 shell(或者如果任何 shell 都可以),因为不同 shell 之间的字符串处理能力差异很大。
  • 不过,我个人不会用 shell 语言来编程,而是使用更适合文本处理的语言,例如 awkRubyPerl - 仅举几例。无论如何,先展示你已经尝试过的东西,这样我们就有了讨论的基础。

标签: perl shell awk


【解决方案1】:

您没有提供有关如何从输入中提取数据的有用信息。所以这段代码是一个完整的猜测,但它确实给出了你从给定输入中要求的输出。更改它以处理其他提取要求将相当简单。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my %session;

while (<>) {
  if (/Applied Rows \[(\d+)]/) {
     if (exists $session{Source}) {
       $session{Target} = $1;
     } else {
       $session{Source} = $1;
     }
  }
  if (/Session \[(\w+)]/) {
    $session{Session} = $1;
  }
}

for (qw[Session Source Target]) {
  say "$_ : $session{$_}";
}

它是作为 Unix 过滤器编写的 - 它从 STDIN 读取并写入 STDOUT。因此,如果您的输入数据在一个文件中,而您希望在另一个文件中输出,您可以这样称呼它:

$ ./session_extract < some_input_file > some_output_file

但如果您的输入是其他进程的输出并且您希望将输出写入 STDOUT,它也可以工作。

$ some_other_process | ./session_extract

(许多其他选项可用 Unix I/O 重定向非常灵活。)

【讨论】:

    【解决方案2】:

    做这样的操作才是正道。

    #! /bin/bash
    
    # Extract session val
    session=$(echo $file | grep "Session" | cut -d"[" -f2 | cut -d"]" -f1)
    # ...
    

    下一个问题是:源 ou 输出行没有区别......必须找到一种方法,比如找到第一次出现?然后第二个?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2021-04-14
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多