В этом случае было бы проще использовать awk
:
% awk '{ print $NF }' file.txt
3
$ NF
- это данные в последнем поле (столбце), разделенном пробелами, во входной записи (строке).
grep
обычно используется для получения целых строк, соответствующих определенному шаблону, но некоторые реализации также могут использоваться для получения битов строк, используя флаг -o
(вернет только совпадающие биты):
% grep -o '[[:digit:]]$' file.txt
3
Но для общей обработки данных в строках я бы рекомендовал awk
вместо grep
.
Если файл содержит другие строки менее релевантных данных:
% awk '/^severity:/ { print $NF }' file.txt
Если, кроме того, поле не находится на крайнем конце строки, вы можете использовать sed
:
% sed -n '/^severity:/s/^.*not waived: \([[:digit:]]*\).*$/\1/p' file.txt
3
Если вы хотите объединить содержимое файла, вы можете сделать это
cat dir*/file1 > file1
cat dir*/file2 > file2
cat dir*/file3 > file3
Подстановочный знак заставит команду cat читать содержимое всех каталогов / файлов, соответствующих шаблону, таким образом, вы получите содержимое файлов с тем же имя во всех трех каталогах записывается в результирующий файл.
Предполагая, что вы знаете только имена каталогов, но не имена файлов, вы можете сохранить имена файлов из одного из каталогов в массив, а затем перебирать элементы, удаляя имя каталога и вставляя результирующее имя файла из каждого каталога:
files=(dir3/*)
for p in "${files[@]}"; do
f=${p#*/}; paste dir1/"$f" dir2/"$f" dir3/"$f" > "$f"; done
Обратите внимание, что это может быть короче, если использовать glob, чтобы shell расширил его (имена каталогов будут использоваться в лексикографическом порядке), например,
for p in "${files[@]}"; do f=${p#*/}; paste dir*/"$f" > "$f"; done