Вот функция POSIX для этого:
mtime() {
touch -r "$1" /etc/fstab
diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}
Результат:
$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500
$ awk 'NR%4==0 { print $0, "in line#", NR }' infile
a in line# 4
b in line# 8
c in line# 12
так:
awk 'NR%4==0' infile
измените на awk 'NR%4==1'
, если вы хотите напечатать первую строку, затем пропустите каждые следующие три строки.
Использованиеawk
:
awk '{ print; getline; getline; getline}' file
getline
переходит к следующей строке файла. См. здесь . Когда мы ничего не делаем, awk
переходит на следующую строку.
В этом случае используется три раза getline
, но на awk
не дается никаких действий, поэтому три строки пропускаются.
Другое использованиеgetline
:
Интересно, что команда getline < "other_file"
используется для чтения строки из другого файла.
Но использование getline
обычно не рекомендуется для этого типа задач и не рекомендуется использовать таким образом, заполняя встроенные переменные и не проверяя результат, см. http://awk.freeshell.org/AllAboutGetline, когда и как использовать getline
.
Или используя awk
с массивом:
awk '{arr[NR]=$0; }END{ for(i=1;i<=NR;i=i+3) print arr[i]}' file
Здесь arr индексируется по номерам записей NR (, т.е. строки )создаются в блоке main
. В блоке END
у нас работает цикл for.
Использование стандартаsed
:
sed -n 'N;N;N;P' file
Для каждой строки, прочитанной из file
, считываются дополнительные три строки и добавляются к исходной строке с разделителями символов новой строки с использованием N
. Затем команда P
печатает исходную строку до первого символа новой строки.
В качестве альтернативы:
sed -n 'p;n;n;n' file
Это аналогично, но сначала печатается текущая строка, а затем считываются три другие строки, которые отбрасываются.