Вы могли использовать, найдите:
find test_file -type f -name "*Error*" -exec mv {} Error_directory/ \;
где -type f
обозначает, что Вы ищете файлы, -name
состояния, которым Вы соответствуете на данном шаблоне. exec
выполняет следующую команду, с {}
занимание места файлов, которые соответствуют параметрам, данным для нахождения.
Если Вы хотите использовать удар и сделать что-то больше вроде того, что Вы попробовали, цикл должен добиться цели:
for f in `ls test_file | grep 'Error'; do
mv test_file/${f} Error_directory
done
В обоих примерах я предположил, что test_file является каталогом, содержащим файлы, которыми Вы интересуетесь.
Это должно работать:
yourcommand | grep -A3 Heading1 | grep -v Heading1
Вот awk решение:
yourcommand | awk '/Heading1/ {for(n=0; n<3; n++) {getline; $1=$1; print}}'
Обновление
Если между Heading1
и конец представляет в виде строки, только имеют строки, запускаются с пространства, можно сделать как это:
yourcommand | awk '/Heading1/ {flag=1;next} /^\w+/ {flag=0} {$1=$1} flag'
Примерно, как сделать это:
$ sed -n -e '/Heading1/,/Heading2/ p' file.txt | grep "^ " | sed 's/^[ ]\+//g'
I am one value.
I am another value.
I am third value.
Более сжатая версия, использует pcregrep
который допускает многострочное соответствие:
$ pcregrep -M 'Heading1(\n|.)*Heading2' file.txt | grep "^[ ]\+"
I am one value.
I am another value.
I am third value.
Для избавлений от пробелов в начале с помощью этого метода Вы могли использовать grep
средство PCRE:
$ pcregrep -M 'Heading1(\n|.)*Heading2' a.txt | grep -oP "^[ ]{3}\K.*"
I am one value.
I am another value.
I am third value.
Наконец вот a sed
и awk
решение.
$ sed -n -e '/Heading1/,/Heading2/ p' file.txt | awk '/^ / {sub(/^[ ]+/, ""); print}'
I am one value.
I am another value.
I am third value.