Я использую MAC-адрес машины в качестве идентификатора пользователя и хочу обновить файл (display.txt), в котором будет отображаться идентификатор пользователя / истечение срока. Как заменить expdate в display.txt датой в expdate.txt , соответствующей MAC-адресу.
Мне удалось использовать идентификатор пользователя:
sed -i "s/user/$(ifconfig eth0 |
grep -o -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}')/" \
/user/id/display.txt > /dev/null
display.txt:
UserID: user
User expiring on expdate
expdate.txt:
user = 00:09:34:2C:66:AB
expdate = 2017-05-20
user = 00:09:34:29:86:6C
expdate = 2017-08-23
Я хотел бы иметь:
display.txt:
UserID: 00:09:34:29:86:6C
User expiring on 2017-08-23
Я нашел однострочное решение, используя grep и sed:
mac=$(ifconfig eth1 | grep -o -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}'); grep "$mac" expdate.txt -A 1 | sed -r ':a;N;$!ba;s!user.*=.(..\:..\:..\:..\:..\:..).*expdate.*=.(....-..-..)!UserID: \1\nUser expiring on \2!g' > display.txt
, и чтобы убедиться, что оно работает с любым MAC-адресом, с которым я тестировал:
mac=$(echo "00:09:34:29:86:6C") ; grep "$mac" expdate.txt -A 1 | sed -r ':a;N;$!ba;s!user.*=.(..\:..\:..\:..\:..\:..).*expdate.*=.(....-..-..)!UserID: \1\nUser expiring on \2!g' > display2.txt
Я сгенерировал вывод с нуля , если вам нужна замена в существующем файле, я предлагаю использовать язык шаблонов, например mustache . Версия Bash находится на GitHub
. Однако, поскольку кажется, что вам нужно повторно использовать MAC-адрес (сначала для поиска, а затем для вывода), я предлагаю создать сценарий bash , и он быть более пригодным для повторного использования.
Объединяя sed
, выводит:
sed -e 's/user/UserID/g' expdate.txt | sed -e 's/ //g' | sed -e 's/=/: /g' | sed -e 's/expdate:/User expiring on/g' > display.txt
(Совершенно очевидно, что это можно сделать также только с одним sed
)