Я протестировал этот сценарий, и он работает. Этот сценарий создает новый файл и удаляет старый файл, если он существует, в домашнем каталоге вашего пользователя.
#!/bin/bash
DATETIME=$(date +"%Y%m%d%H%M%S")
rm ~/env.*.txt
echo "$(hostname)
date:$DATETIME
$(env)" | tee ~/env.$DATETIME.txt
Сначала , изменена дата
на DATETIME
, потому что дата
, скорее всего, уже определена.
Затем rm ~ / env. *. Txt
удаляет любой файл в пользовательском каталоге $ HOME или ~ /, используя glob в качестве подстановочного знака, чтобы соответствовать только статической или фиксированной части имени файла.
Если какой-либо выходной файл, созданный с помощью сценария, должен исправить это и должен быть удален из домашнего каталога.
Если файл не существует, пользователь должен получить в терминале сообщение об ошибке вывода о том, что файл не существует.Это сообщение можно игнорировать, и оно не должно появляться в дальнейшем при запуске сценария.
Кроме того, я использовал tee
вместо >>
просто из привычки, потому что с тройником обычно никогда не бывает проблем.
Наконец, echo
не нужно использовать здесь более одного раза. Я использовал открытые двойные кавычки в первой строке, включил следующие две строки для записи в файл и заканчивал закрытыми двойными кавычками в последней строке, а затем перенаправил на tee
, чтобы записать вывод в файл.
При использовании tee
содержимое, записанное в файл, будет напечатано в терминале, поэтому cat
кажется избыточным.
Кроме того, вы можете добавить вывод в файл в виде новой строки в конце любого существующего файла, используя флаг -a
с tee
следующим образом: тройник -a
С GNU awk
, если вам действительно нужна фиксированная ширина:
awk -v FIELDWIDTHS='2 17 7' -v OFS=', ' '{ print $1, $3 }' test.dat
С bash
:
while read -r line; do
printf '%s, %s\n' "${line:0:2}" "${line:19:7}"
done <test.dat
С несколько современным sed
:
sed 's/^\(..\).\{17\}\(.\{7\}\).*/\1, \2/' test.dat
С perl
:
perl -lpe '$_ = join ", ", unpack "A2x17A7"' test.dat
Вывод для любого из вышеперечисленных:
50, Mike
50, Roy
Короткийsedподход:
sed -En 's/^(.{2}).{17}(\S+).*/\1, \2/gp' test.dat
Выход:
50, Mike
50, Roy
Как насчет вырезать
?
cut -c1-2,20-26 --output-delimiter ', ' test.dat
50, Mike
50, Roy