Команде Linux (например, cat) читать указанное количество символов
Есть ли в linux команда типа cat
, которая может возвращать указанное количество символов из файла?
Например, у меня есть текстовый файл, например:
Hello world
this is the second line
this is the third line
И я хочу что-то, что вернет первые 5 символов, которые будут "привет".
спасибо
Ответы
Ответ 1
head
тоже работает:
head -c 100 file # returns the first 100 bytes in the file
.. будет извлекать первые 100 байт и возвращать их.
Что приятно использовать head
для этого, так это то, что синтаксис для tail
соответствует:
tail -c 100 file # returns the last 100 bytes in the file
Ответ 2
Вы можете использовать dd для извлечения произвольных кусков байтов.
Например,
dd skip=1234 count=5 bs=1
будет копировать байты с 1235 по 1239 с его ввода на его вывод и отбрасывать остальные.
Чтобы просто получить первые пять байтов со стандартного ввода, выполните:
dd count=5 bs=1
Обратите внимание, что если вы хотите указать имя входного файла, dd имеет старомодный синтаксический анализ аргументов, поэтому вы должны:
dd count=5 bs=1 if=filename
Обратите внимание также, что dd подробно объявляет, что он сделал, поэтому, чтобы отбросить это, выполните:
dd count=5 bs=1 2>&-
или
dd count=5 bs=1 2>/dev/null
Ответ 3
head:
Имя
head - выводит первую часть файлов
Описание
head [ OPTION]... [ FILE]...
Описание
Распечатайте первые 10 строк каждого файла FILE на стандартный вывод. С более чем одним ФАЙЛом перед каждым заголовок передается имя файла. Без FILE или когда
FILE - -, прочитайте стандартный ввод.
Обязательные аргументы для длинных опций также обязательны для коротких опций.
-c, - bytes= [-] N
напечатайте первые N байтов каждого файла; с ведущим "-", напечатайте все, кроме последних N байтов каждого файла
Ответ 4
head -Line_number file_name | tail -1 |cut -c Num_of_chars
этот script дает точное количество символов из конкретной строки и местоположения, например:
head -5 tst.txt | tail -1 |cut -c 5-8
дает символы в строке 5 и символы 5-8 строки 5,
Примечание: tail -1
используется для выбора последней строки, отображаемой головкой.
Ответ 5
голова или хвост могут это сделать:
head -c X
Распечатывает первые X байты (не обязательно символы, если это файл UTF-16) файла. tail сделает то же самое, за исключением последних X байтов.
Это (и разрез) переносимы.
Ответ 6
вы также можете выровнять строку, а затем разрезать ее, как, например:
grep 'text' filename | cut -c 1-5
Ответ 7
Я знаю, что ответ отвечает на вопрос, заданный 6 лет назад...
Но я искал что-то подобное в течение нескольких часов, а затем узнал, что:
cut -c делает именно это, с добавленным бонусом, что вы также можете указать смещение.
cut -c 1-5 вернет Hello и cut -c 7-11 вернет мир, Нет необходимости в какой-либо другой команде
Ответ 8
Несмотря на то, что этот ответ был принят/принят много лет назад, принятый в настоящее время ответ верен только для однобайтовых кодировок, таких как iso-8859-1, или для однобайтовых подмножеств многобайтовых наборов символов ( как латинские символы в UTF-8). Даже использование многобайтовых сплайсов вместо этого будет работать только для фиксированных многобайтовых кодировок, таких как UTF-16. Учитывая, что теперь UTF-8 находится на пути к универсальному стандарту и при просмотре этого списка языков по количеству носителей языка и этот список из 30 лучших языков с использованием собственного/вторичного использования, важно указать простой переменный байтовый символ (не байт)), используя cut -c
и tr
/sed
с характерными классами.
Сравните следующее, что вдвойне не удается из-за двух распространенных латинских ошибок/презумпций относительно проблемы с байтами и символами (один из них - head
vs. cut
, другой - [a-z][A-Z]
vs. [:upper:][:lower:]
).
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
к этому (примечание: это отлично работало на FreeBSD, но оба cut
и tr
на GNU/Linux по-прежнему искалечили греческий язык в UTF-8):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Еще один более поздний ответ уже предложил "вырезать", но только из-за побочной проблемы, что его можно использовать для указания произвольных смещений, а не из-за проблемы, непосредственно связанной с символом и байтами.
Если ваш cut
не обрабатывает -c
с кодировками с переменным байтом правильно, для "первых X
символов" (замените X
на ваш номер) вы можете попробовать:
-
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- который ограничен первой строкой, хотя
-
head -n 1 | grep -E -o '^.{X}'
- который ограничен первой строкой и объединяет две команды, хотя
-
dd
- что уже было предложено в других ответах, но действительно громоздко
- Сложный
sed
script с скользящим оконным буфером для обработки символов, распределенных по нескольким строкам, но это, вероятно, более громоздко/хрупко, чем просто использовать что-то вроде dd
Если ваш tr
не обрабатывает символьные классы с кодировками с переменным байтом, вы можете попробовать:
-
sed -E -e 's/[[:upper:]]/\L&/g
(специфичный для GNU)
Ответ 9
Вот простой script, который завершается с использованием подхода dd
, упомянутого здесь:
extract_chars.sh
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi