Linux 如何在Bash中从列表标准数据流中过滤数据?

Linux 如何在Bash中从列表标准数据流中过滤数据?,linux,shell,scripting,awk,Linux,Shell,Scripting,Awk,以下是输出的基本情况: ? RESTRequestParamObj.cpp ? plugins/dupfields2/_DupFields.cpp ? plugins/dupfields2/_DupFields.h 我需要从第二列获取文件名,并将它们传递到rm。有一个类似于AWK'{print$2}'的AWK脚本,但我想知道是否还有其他解决方案。如果?和文件名之间有空格,那么: cut -c9- 如果是标签,则: cut -f2 将输出放在文件中 $&g

以下是输出的基本情况:

?       RESTRequestParamObj.cpp
?       plugins/dupfields2/_DupFields.cpp
?       plugins/dupfields2/_DupFields.h

我需要从第二列获取文件名,并将它们传递到
rm
。有一个类似于
AWK'{print$2}'
的AWK脚本,但我想知道是否还有其他解决方案。

如果
和文件名之间有空格,那么:

cut -c9-
如果是标签,则:

cut -f2

将输出放在文件中

$> cat ./text 
?       RESTRequestParamObj.cpp
?       plugins/dupfields2/_DupFields.cpp
?       plugins/dupfields2/_DupFields.h
用sed编辑它

$> cat ./text | sed -r -e 's/(\?[\ \t]*)(.*)/\2/g'
RESTRequestParamObj.cpp
plugins/dupfields2/_DupFields.cpp
plugins/dupfields2/_DupFields.h
这里的Sed与线路的两部分匹配-

  • ??带制表符或空格
  • 行结束前的其他字符

  • 然后它只使用第二部分更改整行。

    这可能适合您:

     echo "?       RESTRequestParamObj.cpp" | sed -e 's/^\S\+/rm /' | sh
    
    或使用GNU sed

     echo "?       RESTRequestParamObj.cpp"| sed -r 's/^\S+/rm /e'
    

    bash唯一的解决方案,假设您的输出来自stdin:

    while read line; do echo ${line##* }; done
    
    改用cut/perl

    cut -f2 -t'\t'|xargs rm -rf
    
    <your output>|perl -ne '@cols = split /\t/; print $cols[1]'|xargs rm -rf
    
    cut-f2-t'\t'| xargs rm-rf
    |perl-ne'@cols=split/\t/;打印$cols[1]'| xargs rm-rf
    
    。。。假设没有带空格的文件名。要仅删除第一个字符,请尝试
    ${line#?}
    。(这是通配符,不是文字问号;在前面添加一个反斜杠以仅删除问号。)奇怪的是,
    grep-o'[][^]*$”
    将在每个文件名前保留一个空格,但如果您的文件名没有空格,则可以将其传递到
    rm