【问题标题】:Formatting the output in shell在 shell 中格式化输出
【发布时间】:2014-04-24 05:28:48
【问题描述】:

在 shell 中执行一些命令后,我得到如下输出,

file1.txt@@/main/v1/v2/v3/v4/v5/v6/v7/v8/v9/v10/5
file2.txt@@/main/v4/v5/v6/v7/v8/v9/v10/4 
file3.txt@@/main/v9/v10/8 

请告诉我可以应用哪些命令来获得如下的最终输出,只需文件名和每行中的最后 5 个字符

file1.txt  v10/5 
file2.txt  v10/4 
file3.txt  v10/8 

【问题讨论】:

    标签: shell awk sed


    【解决方案1】:

    使用awk

    awk -F"[@/]" '{print $1,$(NF-1)"/"$NF}' file
    file1.txt v10/5
    file2.txt v10/4
    file3.txt v10/8
    

    使用@/ 分隔文本,打印第一个字段、倒数第二个字段和最后一个字段。

    如果需要制表符:

    awk -F"[@/]" '{print $1"\t"$(NF-1)"/"$NF}' file
    file1.txt       v10/5
    file2.txt       v10/4
    file3.txt       v10/8
    

    【讨论】:

      【解决方案2】:

      在管道的末尾添加:

      sed 's!@@.*/\([^/]*/[^/]*$\)!\t\1!'
      

      【讨论】:

      • 这不适用于“tcsh” shell,仅适用于 bash shell。我正在使用“tcsh”外壳。以下是 tcsh shell 上的错误,esekilvxen320 [7:44am] [/home/shell] -> cat opt | sed 's!@@.*/([^/]*/[^/]*$)!\t\1!' @@.: 未找到事件。
      • 要在tcsh 中工作,请将! 替换为% 或其他字符(control-A 有效)。
      【解决方案3】:

      使用 awk:

      awk -F'@@' '{print $1, substr($2, length($2)-4)}' filename
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多