Получение сообщения "ошибка ввода-вывода буфера" обычно указывает на аппаратную проблему с диском, но может быть и так, что файловая система просит систему делать то, что не имеет смысла в результате ее поврежденного состояния.
Лучше всего запустить fsck
на поврежденной файловой системе, а затем посмотреть в /lost+found
восстановленные иноды.
Использование head
иcut
:
$ variable=$( head -n 1 sample1.txt | cut -c 1-4 )
$ printf 'variable is %s\n' "$variable"
variable is ABCD
Это извлекает первую строку, используя head
, а затем вырезает первые четыре символа, используя cut
. Обратите внимание, что некоторые реализации cut
могут возвращать первые четыре байта , а не первые четыре символа (, например. ГНУ cut
). Это будет иметь значение, если данные используют многобайтовые символы.
Использованиеsed
:
$ variable=$( sed 's/^\(....\).*/\1/;q' sample1.txt )
$ printf 'variable is %s\n' "$variable"
variable is ABCD
Это использует sed
и заменяет первую строку ее первыми четырьмя символами, а затем просто выходит из sed
после вывода модифицированной строки.
Оба эти варианта будут производить менее четырех символов, если первая строка содержит менее четырех символов.
Ваш вопрос отмечен тегом исторический -unix . В более старой оболочке sh
вы можете использовать обратные -тики(`...`
)для подстановки команд, а не более современные (и более разумные)$(...)
.
Предполагая, что исторический UNIX, который, как я предполагаю, bash
или более поздние оболочки не поддерживаются, вы можете сделать это в соответствии с POSIX
if IFS= read -r line 2> /dev/null < file; then
result="${line%"${line#????}"}"
printf '%s\n' "$result"
else
printf >&2 '%s\n' 'Unable to read file contents or no newline found in the file'
fi
Решение GNUgrep
(или совместимое )решение:
variable=$(grep -o -m1 '^....' file.txt)
где
-o
только соответствие выхода -m1
остановить после одного совпадения ^
начало строки ....
любой символ, четыре раза примечание:
-o
является нестандартным -расширением GNU (, хотя теперь поддерживается несколькими другими реализациями ), которые будут сообщать о первых 4 символах первой строки, имеющей не менее 4. Если вы используете awk:
var=$(awk 'NR==1 {print substr($0, 1, 4)}' sample1.txt)
Выполнено с помощью Python
praveen@praveen:~$ cat script.py
#!/usr/bin/python
import re
import subprocess
m=re.compile(r'.{4}')
d=[]
h=open('l.txt','r')
for g in h:
d.append(g.strip())
k=re.search(m,d[0])
print k.group()
praveen@praveen:~$
выход
@praveen:~$ python script.py
ABCD
Второй метод с использованием Python
#!/usr/bin/python
import re
import subprocess
m=re.compile(r'.{4}')
d=[]
h=open('l.txt','r')
o=h.readline()
l=re.search(m,o)
print l.group().strip()
output
n@praveen:~$ python script.py
ABCD
praveen@praveen
Поскольку упоминалось, вам нужно сохранить первые 4 символа первой строки в переменной
command
variable=`awk 'NR==1{print substr($0,1,4)}' filename`
выход
variable=`awk 'NR==1{print substr($0,1,4)}' filename`
echo $variable
ABCD