Как инициализировать массив с помощью awk и удар?

Хорошо мне удалось зафиксировать его, но это был реальный ЛАВАШ (для Linux отчаянно нужна более сформировавшаяся система установки драйвера со встроенным откатом, по моему скромному мнению). Вот то, как:

cd /lib/modules/3.2.0-4-amd64/kernel/drivers/net/ethernet/realtek/

Этот каталог имел r8169.bak и r8168.ko. Если бы установщик Realtek только что удалил r8169 вместо того, чтобы создать резервную копию его, то я был бы завинчен.

/sbin/rmmod r8168
ifconfig -a

Оба eth0 и eth1 теперь исчез.

mv r8168.ko r8168.bak
mv r8169.bak r8169.ko
/sbin/depmod `uname -r`
/sbin/modprobe r8169
ifconfig -a

eth0 и eth1 вернулись, и работа.

Таким образом в заключении; установка драйвера и обновляющий в Linux сосет. Лучше надеюсь, что Ваш установщик достаточно хорош для резервного копирования предыдущих драйверов, потому что в Linux в основном говорится, "делают, какого черта Вы хотите установить свои новые драйверы". Должен быть некоторый сервис, который называют для установки драйверов, посредством чего Linux отслеживает предыдущие версии, таким образом, они могут откатываться.

2
23.06.2014, 18:49
4 ответа

Вы могли бы получить лучшие ответы, если бы объяснили контекст , почему awk... и как выглядит первая строка данных.

Поскольку вы не изменили разделитель полей, я предполагаю, что вы обрабатываете строку элементов, разделенных пробелами. Следующее сделает именно то, что вы ищете:

arr_values=()

read -ra arr_values <<< $(head -n 1 file.txt)

for s in "${arr_values[@]}"; do
    echo "$s"
done

Вся работа выполняется командой read. Если только у вас нет необходимости обрабатывать значения в массиве несколько раз; тогда вы можете просто сделать:

set -f    # disable globbing, in case the lines contain wildcard characters
for s in $(head -n 1 file.txt); do
    set +f
    echo "$s"
done
set +f

Это поместит каждую непустую запись, разделенную пробелами, в $s и сделает один проход по циклу.

.
2
27.01.2020, 21:54

Ты не можешь сделать это именно так. Вы должны позволить команде awk выполнить, создав серию выходных значений, разделенных неким разделителем (пробел, табуляция, NUL или что-то в этом роде), а затем назначить их элементам массива. Причина этого в том, что awk - это программа, которая запускается оболочкой и выполняется до завершения любых дополнительных операций оболочки. Вы не можете встраивать оболочку в свои awk-файлы вроде этого.

Вы можете сделать что-нибудь вроде приведенного ниже, чтобы использовать ваш простой пример, но я не уверен, что предоставленный вами код awk будет делать то, что вы хотите в любом случае. Если в файле ноль записей или более одной, на выходе (и, таким образом, в массиве оболочки) будут строки этого файла. Похоже, что вы хотите, чтобы выходной массив содержал набор целых чисел от нуля до количества полей, которые вы найдете в файле, если он содержит только одну запись. Если вы хотите избежать появления в массиве больших файлов, вам придется добавить в код awk второе действие без структуры, содержащее только "{ }", как я сделал ниже. Также, отключите расширение подстановочного символа (set -f) в случае, если строка содержит символы подстановки \[*?.

set -f
arr_values=(`awk '
    NR==1 {
            for (i=0; i<=NF; i++)
               print $i
          }

          { }' file.txt`)
set +f
for ((i=0; i<${#arr_values[@]}; i++))
do
   echo "${arr_values[i]}"
done
2
27.01.2020, 21:54

Если вы хотите использовать awk, вы можете сделать так:

arr_values=( $(awk '{print;exit}' file) )

Оболочка сделает разделение на белые пробелы. Обратите внимание, что если строка содержит подстановочные знаки, то они будут расширены до списка соответствующих файлов (если таковые имеются). Используйте set -f, чтобы отключить расширение подстановочных символов.

set -f
arr_values=( $(awk '{print;exit}' file) )
set +f
2
27.01.2020, 21:54

Не знаю, как другие вещи, но если вы разбиваете на пробелы, то первая строка текстового файла в массиве оболочки будет разбита на пробелы:

set -f ; set -- $(head -n1 <textfile) ; set +f

Это все, что нужно. Теперь вашими позиционными параметрами являются различные индексы массива, а вашим массивом являются "$@".

.
0
27.01.2020, 21:54

Теги

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