Если Ваше намерение состоит в том, чтобы использовать для своей выгоды каталог, и Вы используете bash
4 + это должно сделать:
find . -type d -name doc -print0 \
| while read -rd $'\0' file; do
dname=$(dirname "$file")
fname=$(basename "$file")
mv "$file" "$dname"/"${fname^}"
done
Отметьте использование \0
гарантировать корректную обработку необычных имен файлов.
Поскольку jw013 указывает в комментариях ${var^}
не работает, как я ожидал. Я исправил ответ, чтобы разделить путь к каталогу и имени файла и применяться ^
оператор только к $fname
.
Btw, благодарит стремление добавить недостающий канал.
Отвечать на Ваш вопрос буквально:
sed 's/ */:/g' | cut -d : -f 5
или
awk -F ' +' '{print $5}'
Но так не пойдет, если число в скобках достигает 10 и т.д. Если Вы только интересуетесь числами, Вы могли бы удалить все остальное.
sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6
Эти команды все распечатают последний столбец разделенного файла пространства:
awk '{print $NF}' file
в awk
, NF
количество полей и $NF
последнее поле.
perl -lane 'print $F[$#F]' file
-a
разделяет файл на пробеле в массив @F
, $#F
число элементов в массиве так $F[$#F]
последний элемент. -n
средства читают файл, данный на командной строке, и применяются, сценарий передал с -e
к каждой строке. -l
просто добавляет символ новой строки (\n
) каждому print
оператор.
sed 's/.* //g'
простое регулярное выражение, которое соответствует всему к последнему пространству и удаляет его, оставляя только последний столбец.
rev file | cut -d' ' -f 1 | rev
rev
инвертирует его вывод, таким образом, последнее поле является первым, cut
с разделителем располагают с интервалами для печати его и rev
инвертировать текст назад к нормальному. Выигранный' t работает, если у Вас есть последовательный пробел.
На основе Вашего входа я предполагаю, что Вы на самом деле не хотите последний столбец, но предпоследний или два последних. В этом случае используйте их для печати последних 2 (8.39 Mbits/sec
):
awk '{print $(NF-1),$NF}' file
perl -lane 'print "$F[$#F-1] $F[$#F]"' file
sed 's/.* \(.* .*\)/\1/' file
rev file | cut -d' ' -f 1,2 | rev
и они для печати предпоследнего (8.39
):
awk '{print $(NF-1)}' file
perl -lane 'print $F[$#F-1]' file
sed 's/.* \(.*\) .*/\1/' file
rev file | cut -d' ' -f 2 | rev
Вы не можете разделить несколько вхождений пробелов с помощью cut
в соответствии с руководством:
Поля вывода разделяются одним вхождением символ-разделитель полей.
, если текст не разделен на одинаковую величину или вы не используете tr
, чтобы удалить лишнее.
В противном случае используйте альтернативные инструменты, такие как awk
, sed
или ex
.
Например:
ex -s +'%norm $2Bd0' +%p +q! foo.txt
Заменить + q!
с -cwq
, чтобы сохранить изменения на месте.
Если мы используем команду tr
вместе с параметром squeeze (флаг -s
), чтобы преобразовать все несколько последовательных пробелов в один пробел, а затем выполнить ] cut
с пробелом в качестве разделителя - мы можем получить доступ к требуемому столбцу, содержащему числа.
См. Фрагмент кода ниже:
cat file | тр-с '' | cut -d '' -f 8
Используйте лайнер perl one -вот так:
perl -lane 'print $F[-2]' input_file
Пояснение:
Опция -e
заставляет интерпретатор perl искать сценарий внутри файла, а не в файле.
Опция -n
вызывает построчное чтение входного (файла или STDIN из канала ).
Опция -l
удаляет разделитель входных записей (зависит от ОС -, перевод строки в UNIX по умолчанию )после чтения строки и добавляет его в конце каждойprint
Опция -a
приводит к тому, что каждая входная строка разбивается на пробелы в массив @F
, а $F[-2]
— это второй элемент, считая с конца, который является нужным полем. Вы также можете использовать $F[$#F-1]
, где $#F
— последний индекс массива @F
, который немного хуже читается.
| sed 's/ .*//'
в конце первых двух примеров. Конечно, существует много других способов сделать это. – Gilles 'SO- stop being evil' 18.01.2014, 02:13+
вместо*
: тест кошки | sed's / [^.0-9] \+/:/g' | сократил-d:-f 6 – rubo77 01.09.2016, 11:29+
и?
в ДО, но листы\+
и\?
в неопределенном BRE. – Gilles 'SO- stop being evil' 01.09.2016, 11:57