Описание изменения является точным, но несколько неясным, поскольку wait
обычно рассматривается как ожидание завершения процесса .
Попробуйте это:
sleep 60&
wait %1
затем в другом терминале,
kill -STOP ${pid}
замена ${pid}
на sleep
pid (в качестве вывода, когда он был переведен в фоновый режим ). wait
завершит работу, так как состояние задания изменилось.
При использовании -f
wait
будет ожидать действительного завершения задания или процесса; использованный выше, он не завершится с kill -STOP
и будет ждать возобновления процесса(kill -CONT
)и завершения работы.
Вы можете перечислить поля с помощью AWK:
awk '{ for (i = 1; i <= NF; i++) print i, $i }' file.txt
или с tr
иnl
:
tr ' ' '\n' < file.txt | nl
(Сначала отфильтруйте head -n1
, если вы хотите остановиться в конце первой строки с помощью tr
; в противном случае поля будут учитываться по строкам.)
Вы также можете узнать это, используя массивы Bash (в зависимости отIFS
):
arr=($(head -n1 file.txt))
i=0
while [[ i -lt ${#arr[@]} ]]; do
printf "%d %s\n" $((i+1)) "${arr[$i]}"
((i++))
done
С помощью GNU awk для multi -char RS
и \s
сокращение для[[:space:]]
:
$ awk -v RS='\\s+' '{print NR, $0}' file
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64
Предполагается, что у вас есть только одна строка во вводе, как в примере в вашем вопросе.
Надеюсь, это поможет
$ tr ' ' '\n' < file.txt | nl
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64
$
или
$ read -ab < file.txt
$ for c in ${b[*]}; do echo $c; done | nl
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64
$
Я догадался, что нет никакого правильного решения, а не Стивен Китт . но если вам нужен только IP-адрес , вы можете использовать ниже
tr ' ' '\n' <<<'11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64' | grep IP -A1 | grep -v IP
Соберите поля и расположите их по одному на строке. Затем пронумеруйте их с помощью параметра grep -n.
echo "....." |
grep -Po '\S+' | grep -n ^ | sed 's/:/ /'
или
cat file.txt | grep -Po '\S+' | grep -n ^ | sed 's/:/ /'
Для perls более новой версии, чем 5.14.4
perl -lane '
while (my($i,$e) = each @F) { print "$i $e"; }
' file.input
Решение сsed
$ sed -n '/1/{s/ /\n/g;p}' < file.txt | nl
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64
$