【问题标题】:Using awk to extract text from grep match and place side by side使用 awk 从 grep 匹配中提取文本并并排放置
【发布时间】:2019-03-09 14:09:10
【问题描述】:

我在一个目录中有一堆.jks 文件。我想提取别名,从日期和到期日期开始有效。现在我有以下内容:

for f in *; do if [ -f $f ]; then echo "" |keytool -list -v -keystore $f | grep -e "Alias name:" -e "Valid from:"; fi done

会输出类似的东西

Alias name: somehostname.com

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

.
.
.

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022 

每个别名至少有 1 个证书,但最多有 n 证书。

我希望上面的输出格式如下:

somehostname.com \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT 2022

{empty}          \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT 2022

.
.
.

{empty}          \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT 2022

{empty} 表示对齐的空格。 \t 表示 TAB 分隔符。

这将是 一个 .jks 文件的最终输出。
我想对目录中的所有.jks 文件执行此操作。

如何使用 awk 修改现有的命令行脚本来执行此操作?

【问题讨论】:

  • 为了清晰起见,我已经格式化了。
  • 删除所有标题和尾随`以及不必要的空行。
  • 为什么有sed标签?
  • 你真的想要字符串{empty}吗?
  • @Beta 因为我不知道 awk 还是 sed 是这里更好的选择。想要包括这两个选项。 @tink No {empty} 在这种情况下只是为了表示空白,以便底部行对齐并向右移动。 @Tiw keytool 命令只显示一堆我不需要的随机乱码文本和其他信息。我认为 grep 在这里是必要的。

标签: linux bash awk sed


【解决方案1】:

这并不漂亮(或简单),但可以满足您的要求:

cat sam.awk
/Alias name:/ {
  count=0
  l=length($3);
  printf "%s ", $3
}
/Valid from:/ {
  count++;
  gsub(/Valid from:/, "\\t");
  gsub(/until:/, "\\t");
  space=0
  if(count!=1) {
    space=l-4
    printf "{empty}"
  };
  printf " %*s %s %s %s %s %s %s %s %s %s %s %s %s\n",space,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15
}

由于我没有任何 jsk 文件可播放,因此我将您的实际输出作为实验的输入(为了模拟多个文件的输出,我复制了一个条目并更改了主机名):

cat sam
Alias name: somehostname.com

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022 
Alias name: hostname.com

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022

像这样调用awk -f sam.awk sam 它给出以下内容:

awk -f sam.awk sam
somehostname.com  \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT
{empty}           \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT
{empty}           \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT
hostname.com  \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT
{empty}       \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT
{empty}       \t Wed Mar 01 00:00:00 GMT 2019 \t Wed Mar 01 00:00:00 GMT

【讨论】:

    【解决方案2】:

    如果你有GNU awk,并用空格代替{empty},可以这样做:

    awk 'BEGIN{RS="Alias name: *";FS="Valid from: *";}FNR>1{gsub(/until:/,"\t");gsub(/\n/,"");print $1 "\t" $2; i=3; while($i){for(j=0;j<length($1);j++)printf " "; print "\t" $i; i++;}}' file
    

    有了这个file

    Alias name: somehostname.com
    
    Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022
    
    Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022
    Valid from: Tue Feb 01 00:00:00 GMT 2019 until: Sat Jun 01 23:00:00 GMT 2062
    
    Alias name: another.com
    
    Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022
    
    Alias name: yetanother.com
    
    Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022
    Valid from: Wed Mar 01 00:00:00 GMT 2019 until: Wed Mar 01 00:00:00 GMT 2022
    

    产生这个输出:

    somehostname.com    Wed Mar 01 00:00:00 GMT 2019     Wed Mar 01 00:00:00 GMT 2022
                        Wed Mar 01 00:00:00 GMT 2019     Wed Mar 01 00:00:00 GMT 2022
                        Tue Feb 01 00:00:00 GMT 2019     Sat Jun 01 23:00:00 GMT 2062
    another.com Wed Mar 01 00:00:00 GMT 2019     Wed Mar 01 00:00:00 GMT 2022
    yetanother.com  Wed Mar 01 00:00:00 GMT 2019     Wed Mar 01 00:00:00 GMT 2022
                    Wed Mar 01 00:00:00 GMT 2019     Wed Mar 01 00:00:00 GMT 2022
    

    【讨论】:

    • 我怎样才能让列的宽度都是固定的,这样看起来更整洁?
    • @SamuelRodriguez 三种方法: 1. 使用额外的命令先确定最长域,然后将其用作填充长度。 2. 使用多个TAB 作为first 分隔符。 3. 使用比较长的固定宽度放置第一(域加上填充空间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2019-04-19
    • 2010-11-02
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多