在linux中获取字符串后的特定输出

在linux中获取字符串后的特定输出
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service

我需要在 Linux 中过滤掉这个输出并得到结果

first_service,second_service

答案1

使用GNUsed

$ sed -Ez 's/[^0-9]*[^[:alpha:]]*([^ ]*) ([^\n]*)\n?/\1_\2,/g;s/,$/\n/' input_file
first_service,second_service

答案2

使用(以前称为 Perl_6)

~$ raku -e 'my $i=0; my @a; for lines() {  \
            $i=1 and next if /^ \s+ SERVICE_NAME /;  \
            if ($i.Bool) { @a.push: .words.skip.join("_") } else {next};};  \
            .put for @a.join(",");'  file

或者

~$ raku -e 'my @a; for lines() {  \
            @a.push( $_.words.skip.join: "_" ) if /^ \s+ SERVICE_NAME / ^fff * }; \
            .put for @a.join(",");'  file

输入示例:

Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service

示例输出:

first_service,second_service

Raku 是 Perl 家族的一种编程语言。该项目由 Larry Wall 及其同事于 2000 年启动。首次发布于 2015 年 12 月。Perl6 语言更名为2019年。

上面的第一个答案:代码声明了一个标量$i和一个数组@a。输入是用 获取的lines()。在块内,搜索{...}哨兵线。^ \s+ SERVICE_NAME如果找到,则$i设置为1并且代码继续执行该next行。

$i从这里开始,如果强制转换为Boolan is ,则运行最后两个语句True。当$i.Boolis时True,该{...}块被输入:该行被分成空格分隔.words,第一个单词(即数字)被skipped ,其余部分join用下划线 ed 。最后,该行出来了putjoined 带有逗号。

上面的第二个答案:代码使用 Raku 的sed类似“触发器”运算符fff及其变体。^fff代码中的变体打开,用于在找到哨兵线后捕获行SERVICE_NAME。这*意味着直到目标文件末尾的所有行都被push添加到数组中。请参阅上面有关文本处理和 out 的讨论put

https://docs.raku.org/language/operators#infix_^fff
https://raku.org

答案3

这个解决方案肯定还有改进的空间。如果我做得更好sed,我觉得这可以压缩成一次调用sedgrep如果我知道如何sed删除不以数字字符串开头的模式空间,甚至可以消除。可能会更好awk

grep -E '^[0-9]+' input_file |
    sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
    sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'

$ cat << EOF > input_file
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service
39      third of four
427     fourth and final service
EOF
$ grep -E '^[0-9]+' input_file |
    sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
    sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'
first_service,second_service,third_of_four,fourth_and_final_service

相关内容