Эта версия rpcinfo
выглядит несколько поспешным, так как номер порта отображается в виде двух отдельных байтов вместо одного 16-битного -числа.
Предполагается, что служба portmapper
всегда находится на порту 111, поскольку она используется для поиска всех других служб RPC, номера портов которых могут различаться. (Поскольку протокол ONC RPC был разработан до того, как брандмауэры получили широкое распространение, современные реализации все чаще используют статические номера портов; например. Ожидается, что NFS будет работать через порт 2049 по умолчанию.)
На стороне IPv6 это наиболее отчетливо видно. :IPv6-адрес со всеми -нулями отображается как ::
, а затем номер порта представляется как .0.111
после него. В данном случае это означает, что старший байт номера порта равен 0, а младший байт — 111.
Тот же синтаксис используется на стороне IPv4 :поле адреса содержит все -нули IPv4-адреса (INADDR _ANY)0.0.0.0
и двухбайтовое -представление адреса номер порта .0.111
объединен вместе.
Фактический номер порта можно получить, умножив старший бит номера порта на 256, а затем прибавив к нему значение младшего бита. Так, например, номер порта 2049 будет отображаться как .8.1
в этом синтаксисе(8
*256 + 1
= 2049)
Подход с использованием sed.
prefix1=a.
prefix2=b.
while read r_line; do
c2=$(echo $r_line | cut -d'|' -f2)
c4=$(echo $r_line | cut -d'|' -f4)
s1=$(echo $c2 | sed "s/,/,$prefix1/g" | sed "s/^/$prefix1/g")
s2=$(echo $c4 | sed "s/,/,$prefix2/g" | sed "s/^/$prefix2/g")
echo "this is final string $s1=$s2"
done
Скрипт выполняет поиск ,
и вместо этого ,$prefix
и, наконец, добавляет $prefix
в начало. И мне нравится использовать cut
для разделения строк.
Вы можете прочитать каждую строку, использовать cut
, чтобы получить каждое поле и использовать sed
для них.
while read -r line; do
a="$(cut -d'|' -f2 <<<"$line")"
b="$(cut -d'|' -f4 <<<"$line")"
a="$(echo "$a"|sed -e 's/^/a./' -e 's/,/,a./g')"
b="$(echo "$b"|sed -e 's/^/b./' -e 's/,/,b./g')"
echo "this is final string $a=$b"
done < csv_file
полное решение awk
файл awk (se.awk)
BEGIN { FS="|" }
{
a="" ; n=split($2,A,",") ; for (i=1;i<=n;i++) a = a ",a." A[i] ;
b="" ; n=split($4,B,",") ; for (i=1;i<=n;i++) b = b ",b." B[i] ;
printf "%s %s=%s\n",prefix,substr(a,2),substr(b,2) ;
}
называется
awk -v prefix="this is final string" -f se.awk c
this is final string a.c1=b.t1
this is final string a.c1,a.c2=b.t1,b.t2
где
-v prefix="this is final string"
установить переменную prefix
в командной строке BEGIN { FS="|" }
указать awk использовать |
в качестве разделителя a="" ; n=split($2,A,",")
Поле доли секунды на ,
и счет for (i=1;i<=n;i++) a = a ",a." A[i]
построить ожидаемую строку с нежелательной запятой в начале prefix="this is final string"
собрать строку с помощью printf, чередуя запятую если префикс фиксированный, то его можно вставить в программу awk
BEGIN {
FS="|" ;
prefix="this is prefix" ;
}
Вы можете сделать все это внутри bash
, прочитав файл csv в массив, а затем выведя 2-е и 4-е поля, сначала выполнив подстановку параметров в них
while IFS='|' read -ra a;do
echo This is the final string: \
"a.${a[1]//,/,a.}=b.${a[3]//,/,b.}"
done < csvfile