Эта команда awk должна выполнить трюк,
awk '{if ($1) {$1=strftime("%c",$1); print}}' /var/lib/misc/dnsmasq.leases
Старая версия, которая выведет эпоху Unix на пустые строки:
awk '{time=$1; $1=""; print strftime("%c",time) $0}' /var/lib/misc/dnsmasq.leases
Трюк заключается в применении strftime только к соответствующему аргументу и распечатать все остальное как есть. Я взял этот бит из этого вопроса. (Так как ваша функция strftime работала правильно, я предполагаю, что у вас установлен gawk. Если нет, сделайте sudo apt-get install gawk.)
Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.
Здесь что-то странное, потому что команда
awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml
уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):
awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml
awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml
awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml
awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml
Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:
awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml
awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml
Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.
Общее решение, предложенное здесь , таково:
awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml
awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml
Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.
Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.
Здесь что-то странное, потому что команда
awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml
уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):
awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml
awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml
awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml
awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml
Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:
awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml
awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml
Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.
Общее решение, предложенное здесь , таково:
awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml
awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml
Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.
Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.
Здесь что-то странное, потому что команда
awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml
уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):
awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml
awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml
awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml
awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml
Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:
awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml
awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml
Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.
Общее решение, предложенное здесь , таково:
awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml
awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml
Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.