Постоянство работает в Minimal Linux Live и поддерживается в двух различных формах. Посмотрите заголовок тестового сценария QEMU , где вы можете узнать, как попробовать/протестировать эту функцию.
Обратите внимание, что поддержка постоянства не входит в стандартную комплектацию. Вы должны явно перестроить MLL и активировать параметр наложение папки или параметр разреженного наложения . В зависимости от того, какой вариант вы выберете, ваши изменения будут сохраняться в специальной папке (, таким образом, наложение папки с именем ), или в специальном файле изображения (разреженном файле, если быть точным, таким образом разреженное наложение именование ). Кроме того, в зависимости от вашего выбора, вы должны убедиться, что загрузочный носитель содержит папку /minimal
(для наложения папки )или специальный файл изображения /minimal.img
. Кроме того, поскольку для MLL нет официального установщика, вам придется использовать утилиты Syslinux (, например. extlinux ), чтобы подготовить загрузчик. И вам также придется использовать fdisk или любой другой инструмент управления дисками, чтобы подготовить раздел диска (s ).
Я предлагаю вам попробовать folder overlay
и использовать одну большую файловую систему EXT2 для вашего USB-накопителя. Затем вы копируете/распаковываете структуру ISO в корневую папку флэш-памяти USB и выполняете extlinux
с соответствующими аргументами, чтобы сделать флэш-накопитель USB загрузочным. На самом деле это можно описать как серию простых шагов, которые необходимо выполнить в основном документе MLL «readme».
Вы можете использовать два индексированных массива для хранения количества запросов и существующих узлов для каждого имени, а перед печатью вы можете сравнить массив существующих узлов с вашим фиксированным массивом узлов, например:
awk 'BEGIN {
totalNodes="36 54 69 76"
}
NR==1 {print "<Name> <Nodes> <Count of Requests>"};
NR>1 {
count[$1]+=$4; nodesTmp[$1]=nodesTmp[$1]" "$3;
}
END{
for (i in count) {
if(totalNodes!=nodesTmp[i]) {
split(totalNodes,tmp);
for(j in tmp){
if(nodesTmp[i]!~tmp[j]){
nodes[i]=nodes[i]" NA"
}
else {
nodes[i]=nodes[i]" "tmp[j]
}
}
}
else{
nodes[i]=nodesTmp[i]
};
print i, nodes[i], count[i] | "sort"
};
}' temp.log
Предполагая, что GNU awk
для PROCINFO
и истинные двойные -массивы индексов, следующее будет работать:
gawk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc"}
FNR>1{nodes[$3]=1; total[$1]+=$4; sgl_nodes[$1][$3]=1}
END{
printf "<Name> <Nodes> <Count of Requests>\n"
for (f in sgl_nodes) {
printf "%s%s",f,OFS;
PROCINFO["sorted_in"]="@ind_num_asc";
for (g in nodes) {
if (sgl_nodes[f][g]) printf "%s%s",g,OFS; else printf "NA%s",OFS
};
PROCINFO["sorted_in"]="@ind_str_asc";
printf "%d%s",total[f],ORS
}
}' temp.log
Это зарегистрирует фактически встречающиеся номера узлов в массиве nodes
и номера, связанные с каждым отдельным именем в двухмерном -массиве sgl_nodes
, сохраненном со значением <Name>
в качестве первого индекса. При обработке он также суммирует общее количество запросов в массиве total
по индексу массива, соответствующему значению <Name>
.
В конце -файла -мы сначала печатаем строку заголовка, а затем перебираем массив sgl_nodes
для печати для каждого <Name>
значения (первого индексаsgl_nodes
)имени, а затем выполнить итерацию по всем узлам, зарегистрированным в nodes
, чтобы вывести либо номер узла (, если он встречается для этого конкретного <Name>
), либо NA
(, если этот узел отсутствует ), и, наконец, общее количество запросов.
<Name>
значений и печатаются в порядке возрастания благодаря настройке PROCINFO
, выполненной в разделе BEGIN
, которая переопределяет числовую сортировку для перебора массива nodes
.
Этот подход не полагается на сортировку temp.log
записей и автоматически распознает номера узлов.
Преимущество распознавания номеров узлов автоматически превращается в проблему, если один из номеров узлов отсутствует во всех записях. Однако, поскольку вы заявили, что список узлов можно считать фиксированным, мы можем прибегнуть к жесткому -кодированию этого списка, чтобы избежать этой проблемы :
.gawk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc";split("36 54 69 76",nodes)}
FNR>1{total[$1]+=$4; sgl_nodes[$1][$3]=1}
END{
printf "<Name> <Nodes> <Count of Requests>\n"
for (f in sgl_nodes) {
printf "%s%s",f,OFS;
for (g=1;g<=4;g++) {
if (sgl_nodes[f][nodes[g]]) printf "%s%s",nodes[g],OFS; else printf "NA%s",OFS
};
printf "%d%s",total[f],ORS
}
}' temp.log
Вот еще одно awk-решение:
$ awk '{if(NR==1){printf "%s\t%s\t%s\n", "<Name>","<Nodes>","<Count of Requests>"} else{nodes[$3]=1; a[$1][$3]++; sum[$1]+=$4}}END{for(string in a){ printf "%s\t", string; for(i in nodes){ (a[string][i]) ? val=i : val="NA"; printf "%s ",val }; printf "\t%d\n",sum[string];}}' file
<Name> <Nodes> <Count of Requests>
CString3 36 54 NA 76 23
DString4 36 54 69 76 31
AString1 36 54 69 76 12
BString2 36 54 69 76 7
Я добавляю символ табуляции между каждой записью («Имя»,«Узлы» и «Количество запросов» ), чтобы вы могли легко разделить их позже.
А вот тот же скрипт в более разборчивой форме (вы все равно можете скопировать/вставить прямо в терминал):
awk '{
## If this is the first line
if(NR==1){
## Set up the nodes array with the desired values
nodes[36]=1;
nodes[54]=1;
nodes[69]=1;
nodes[76]=1;
## Print the header
printf "%s\t%s\t%s\n", "<Name>","<Nodes>","<Count of Requests>"
}
## For all except the first line
else{
## Save this node in the nodes array
nodes[$3]=1;
## add this node to the values found for this string
a[$1][$3]++;
## add the number of requests
sum[$1]+=$4
}
}
## After we have finished reading the file
END{
## a holds all the first fields, the various strings
for(string in a){
## Print the current string and a tab
printf "%s\t", string;
## For each target node
for(i in nodes){
## If this node has a value for this string, use the value.
## If it does not, use "NA".
(a[string][i]) ? val=i : val="NA";
## Print the value for the node
printf "%s ",val
};
## Print the sum
printf "\t%d\n",sum[string];
}
}' file
$ cat tst.awk
NR==1 {
print "<Name>", "<Nodes>", "<Count of Requests>"
next
}
$1 != prev {
if ( NR > 2 ) {
prt()
}
prev = $1
}
{
reqs[$3]
numReqs += $4
}
END { prt() }
function prt( i, n, node, nodes) {
n = split("36 54 69 76", nodes)
printf "%s ", prev
for (i=1; i<=n; i++) {
node = nodes[i]
printf "%s ", (node in reqs ? node : "NA")
}
print numReqs
delete reqs
numReqs = 0
}
$ awk -f tst.awk file
<Name> <Nodes> <Count of Requests>
AString1 36 54 69 76 12
BString2 36 54 69 76 7
CString3 36 54 NA 76 23
DString4 36 54 69 76 31