Как распечатать совпадающее значение шаблонного разделителя полей в AWK

Я думаю, что это - просто проблема заключения в кавычки при передаче аргументов в функцию.

Попытайтесь назвать его как так:

$ special_execute "echo 'abc'"
'abc'

Если Вы не хотите одинарных кавычек вокруг abc затем измените заключение в кавычки как это:

$ special_execute "echo abc"
abc

Отладка

Можно перенести внутренности функции так, чтобы она отозвалась эхом с большим количеством многословия.

$ function special_execute() { set -x; "$@"; set +x; }

Затем, когда Вы команды выполнения через функцию, special_execute Вы видите то, что продолжается.

пример PS:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

пример жемчуга:

$ special_execute perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

Парсинг аргумента $1

Вы могли сделать что-то вроде этого для парсинга любых аргументов, переданных в как $1.

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

Пример

с включенной отладкой:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

с отладкой прочь - -123:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

с отладкой прочь - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
4
16.01.2015, 05:30
2 ответа

Вы не хотите значение Fs ; Вы хотите строку, соответствующую ФС (которые могут быть разными строками на одной линии):

> awk -F"[0-9]+." '{ printf "line %3d.: ",NR; 
  if (NF==1) { print "No FS match in this line"; next; }; str=$0; 
  for(j=1;j<NF;j++) { match(str, FS); fs_str=substr(str, RSTART, RLENGTH); 
  printf "_%s_, ",fs_str; str=substr(str, RSTART+RLENGTH)}; print ""; }' file
line   1.: _14._, _20._, 
line   2.: _1._, _1._, 
line   3.: _2._, _2._, 
line   4.: _3._, _3._,
2
27.01.2020, 21:00

Мне нравится Gawk FPAT для этого

awk -vFPAT='[[:digit:]]+\\.' 'NF{$1=$1; print}' file
14. 20.
1. 1.
2. 2.
3. 3.
0
27.01.2020, 21:00

Теги

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