Как отфильтровать несколько строк

Вы также можете использовать небольшую программу C для печати даты и времени в формате, который может быть непосредственно проанализирован с помощью оболочки

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char * argv[]) {

    if (argc==1) { 
        return 1;
    }

    struct tm input_tm;
    char * formatStr  = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
    size_t formatSize = strlen(formatStr) + 2;
    char * output     = (char *)malloc(sizeof(char)*formatSize);

    strptime(argv[1],"%s",&input_tm);
    strftime(output, formatSize, formatStr, &input_tm);

    printf("%s\n",output);
    free(output);
    return 0;
}

:

#compile
clang -o epoch2datetime main.c

#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
2
06.10.2018, 16:59
4 ответа

Вот один из способов сделать это:

sed -re 's/[^ ]+://' -e 's# +[0-9]+/# #' -e 's/:$//'

Пояснение:

  • sed -r-использовать sed в расширенном -режиме регулярного выражения
  • -e 's/[^ ]+://'-удалить все до первого двоеточия назад до пробела
  • -e 's# +[0-9]+/# #'-заменить любое количество пробелов, число и косую черту одним пробелом
  • -e 's/:$//'-удалить двоеточие в конце строки
4
27.01.2020, 21:49
cat file | sed 's/[:/]/\t/g' | awk '{print $1 " " $3 " " $5}'
tcp 25 master
tcp 443 nginx
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx
tcp 22 sshd
tcp 5432 postmaster
udp 323 chr

sed 's/[:/]/\t/g' convert `:` and '/` to tab
2
27.01.2020, 21:49

Это кажется более простым и легким для запоминания. Параметр -Fдля AWK позволяет вам предоставить класс регулярного выражения, который включает в себя символы, которые вам нужно разделить.

awk -F'[ :/]' '{print $1,$3,$5}' file

steve (ниже )упомянул более короткий путь, чем я изначально думал:

  • Вместо cat file |...просто поместите файл в конец.
  • Запятые между долларовыми элементами добавляют пробелы.
5
27.01.2020, 21:49

С одинарнымawk:

$ awk '{ print $1, gensub( /^.*:/, "", "1", $2 ), gensub( /[0-9]+\//, "", "1", $3 ) }' input
tcp 25 master
tcp 443 nginx:
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx:
tcp 22 sshd
tcp 5432 postmaster
udp 323 chronyd
2
27.01.2020, 21:49

Теги

Похожие вопросы