Как передать аргументы жемчугу при попытке изменить строку?

Как вы указали, существует ограниченный набор веб-сайтов, к которым приложения должны получить доступ, предоставить их в/etc/hosts и отключить DNS-поиск. Просто убедитесь, что у вас есть механизм обновления этих файлов хостов (либо удаленный инициированный scp , либо загрузка на регулярной основе).

Это не запретит людям использовать IP-адреса для подключения к нежелательным сайтам, но сделает весь серфинг гораздо менее приятным.

-121--150742-

Для этого используется команда GNU date . Однако может потребоваться последовательности и распечатать соответствующую дату:

$ date -d "11/11/2014 04:12:03PM"
Tue Nov 11 16:12:03 CET 2014

Обратите внимание, что не нравится DD-MM-YYY :

$ date -d "11-11-2014"
date: invalid date ‘11-11-2014’

Поэтому сначала запустите sed в файле, чтобы заменить все - на /. Затем пройдите через прочитайте , чтобы получить каждое поле в отдельную переменную, преобразуйте и сортируйте:

$ sed 's#-#/#g' file | while read date _ hour rest; do 
    echo "$(date -d "$date $hour" +"%F - %R:%S") $rest"
  done | sort -h
2014-11-12 - 00:08:03 lat = 41.937911; lon = /93.369249
2014-11-12 - 00:11:29 lat = 41.949656; lon = /93.329133
2014-11-12 - 00:23:02 lat = 42.025385; lon = /93.347026
2014-11-12 - 00:29:10 lat = 41.033341; lon = /93.380586
2014-11-12 - 00:38:08 lat = 41.036720; lon = /93.436851
2014-11-12 - 00:45:20 lat = 41.998129; lon = /93.400943
2014-11-12 - 00:53:36 lat = 41.961489; lon = /93.414624
2014-11-12 - 03:03:59 lat = 41.990516; lon = /93.430704
2014-11-12 - 03:05:15 lat = 41.001546; lon = /93.443352

Это будет работать над вашим примером, но не удастся, если вам также нужно сортировать февраль ( 02 ) до ноября ( 11 ). Таким образом, хитрость состоит в том, чтобы напечатать даты как секунд со времени эпохи , сортировать по этому и затем удалить его:

$ sed 's#-#/#g' file | while read date _ hour rest; do 
  printf "%s\t%s %s\n" "$(date -d "$date $hour" +"%s")" "$date - $hour" "$rest"
done | sort | cut -f 2-
11/12/2014 - 12:08:03AM lat = 41.937911; lon = /93.369249
11/12/2014 - 12:11:29AM lat = 41.949656; lon = /93.329133
11/12/2014 - 12:23:02AM lat = 42.025385; lon = /93.347026
11/12/2014 - 12:29:10AM lat = 41.033341; lon = /93.380586
11/12/2014 - 12:38:08AM lat = 41.036720; lon = /93.436851
11/12/2014 - 12:45:20AM lat = 41.998129; lon = /93.400943
11/12/2014 - 12:53:36AM lat = 41.961489; lon = /93.414624
11/12/2014 - 03:03:59AM lat = 41.990516; lon = /93.430704
11/12/2014 - 03:05:15AM lat = 41.001546; lon = /93.443352
11/12/2014 - 03:11:50AM lat = 42.039054; lon = /93.442001

Или для печати дат в формате 24H:

$ sed 's#-#/#g' file | while read date _ hour rest; do 
    printf "%s\t%s %s\n" "$(date -d "$date $hour" +"%s")" \ 
    "$(date -d "$date $hour" +"%F - %R:%S")" "$rest"
  done | sort | cut -f 2-
2014-11-12 - 00:08:03 lat = 41.937911; lon = /93.369249
2014-11-12 - 00:11:29 lat = 41.949656; lon = /93.329133
2014-11-12 - 00:23:02 lat = 42.025385; lon = /93.347026
2014-11-12 - 00:29:10 lat = 41.033341; lon = /93.380586
2014-11-12 - 00:38:08 lat = 41.036720; lon = /93.436851
2014-11-12 - 00:45:20 lat = 41.998129; lon = /93.400943
2014-11-12 - 00:53:36 lat = 41.961489; lon = /93.414624
2014-11-12 - 03:03:59 lat = 41.990516; lon = /93.430704
2014-11-12 - 03:05:15 lat = 41.001546; lon = /93.443352
2014-11-12 - 03:11:50 lat = 42.039054; lon = /93.442001

-121--196297-

я бы использовал awk с сортировкой :

awk '{while("date +%T -d" $3|getline x){$3=x}}1' logfile | sort -t- -n -k3 -k1 -k2

Позволяет сначала немного изменить журнал, чтобы иметь другие даты:

11-12-2010 - 03:03:59AM lat = 41.990516; lon = -93.430704
11-12-1998 - 03:05:15AM lat = 41.001546; lon = -93.443352
11-12-2030 - 03:11:50AM lat = 42.039054; lon = -93.442001
11-12-2014 - 12:08:03AM lat = 41.937911; lon = -93.369249
11-12-2014 - 12:11:29AM lat = 41.949656; lon = -93.329133
11-11-2014 - 12:23:02AM lat = 42.025385; lon = -93.347026
11-12-2011 - 12:29:10AM lat = 41.033341; lon = -93.380586
11-12-2011 - 12:38:08AM lat = 41.036720; lon = -93.436851
10-12-2014 - 12:45:20AM lat = 41.998129; lon = -93.400943
11-12-2014 - 12:53:36AM lat = 41.961489; lon = -93.414624

Результат будет:

11-12-1998 - 03:05:15 lat = 41.001546; lon = -93.443352
11-12-2010 - 03:03:59 lat = 41.990516; lon = -93.430704
11-12-2011 - 00:29:10 lat = 41.033341; lon = -93.380586
11-12-2011 - 00:38:08 lat = 41.036720; lon = -93.436851
10-12-2014 - 00:45:20 lat = 41.998129; lon = -93.400943
11-11-2014 - 00:23:02 lat = 42.025385; lon = -93.347026
11-12-2014 - 00:08:03 lat = 41.937911; lon = -93.369249
11-12-2014 - 00:11:29 lat = 41.949656; lon = -93.329133
11-12-2014 - 00:53:36 lat = 41.961489; lon = -93.414624
11-12-2030 - 03:11:50 lat = 42.039054; lon = -93.442001

Хитрость здесь состоит в том, чтобы использовать - в качестве разделителя полей и сортировать сначала по 3-му полю (год), затем по первому (месяц), затем по второму (день). Все операции сортировки являются числовыми (опция -n ).

0
13.04.2017, 15:22
2 ответа

Начиная с вашей первой попытки, вы хотите $ {par1} , расширенные оболочкой, и все остальные $ переменные, защищенные от него (так, чтобы Perl их вместо этого расширяет):

perl -i -pe "s/(keepme=)(.*)/\$1${var1}/ if \$. == 1" ../file.txt

Двойные кавычки, а не отдельные цитаты, делают его так, чтобы Perl получает , вместо имени переменной вместо имени переменной, и избежать других знаков доллара с обратной косами.

1
28.01.2020, 02:28

Для доступа к переменной среды в Perl вы можете использовать $ env {var1}.

Для этого вы можете экспортировать переменную, это будет означать, что переменная установлена ​​до тех пор, пока вы не расстроитесь:

Export Var1 = NewString

PERL -I -PE 'S / (Keepme =) (. *) / $ 1 $ env {var1} / if $. == 1 '../file.txt

Alternabiance, если вы хотите только установить переменную, которая будет использоваться командой perl, когда вы выполняете ее, вы можете назначить его в Фронт вашей команды:

var1 = newstring2 perl -i -pe 's / (meefme =) (. *) / $ 1 $ env {var1} / если $. == 1' ../file.txt

2
28.01.2020, 02:28

Теги

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