如何从Bash中列表的stdout流中过滤数据?

时间:2011-11-12 01:29:31

标签: linux shell scripting awk

这是输出的样子,基本上是:

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

我需要从第二列获取文件名并将其传递给rm。 AWK脚本就像awk '{print $2}',但我想知道是否有另一种解决方案。

5 个答案:

答案 0 :(得分:3)

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

cut -c9-

如果他们是标签,那么:

cut -f2

答案 1 :(得分:1)

将您的输出放在文件

$> 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匹配2行 -

  1. ?带有标签或空格
  2. 直到行尾的其他字符
  3. 然后它只用第二部分改变整行。

答案 2 :(得分:0)

这可能对您有用:

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

或使用GNU sed

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

答案 3 :(得分:0)

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

while read line; do echo ${line##* }; done

答案 4 :(得分:0)

使用cut / perl代替

cut -f2 -t'\t'|xargs rm -rf

<your output>|perl -ne '@cols = split /\t/; print $cols[1]'|xargs rm -rf