Perguntas do teste escrito em Linux sobre problemas de linguagem Awk (dificuldade crescente)
Artigo Diretório
Tópico (mais prática, mais prática, mais prática, sem atalhos)
-
Processe apenas linhas com um ID de usuário ímpar e imprima o nome do usuário e o número uid
awk -F: '$3%2==1{print $1 $3}' /etc/passwd #关系表达式考察
-
Exibir os usuários comuns do sistema e imprimir o nome do usuário e ID
awk -F: '$3>=1000{print $1 $3}' /etc/passwd #关系表达式考察
-
Exibir os usuários comuns do sistema e imprimir o nome do usuário e ID
awk -F: '$7~/\/bin\/bash$/{print $1,$3}' /etc/passwd #~指的是 正则于
-
Conte o número de usuários comuns
awk -F: '$3>=1000{++count}END{print count}' /etc/passwd #模式考察 awk -F: '$3>=1000{++count| "wc -l"}' /etc/passwd #模式考察
-
Conte o número total de linhas de texto
END{ print NR} #num of record #模式考察还有记录内置变量NR
-
Mostrar nome do arquivo
END{ print FILENAME} #不能在过程处理中输出
-
Exibir informações sobre usuários com UID 1002
awk -F: 'if($3==1002)system("id $1")' /etc/passwd #判断语句考察 awk -F: '$3==1002{print $0}' /etc/passwd #判断语句考察
-
Use awk para simular tail -l
END{ print $0} #输出整行
-
Conte o número de links tcp
netstat -ant|awk '/^tcp/{++temp[$NF]}END{for (i in temp) print "temp[",i,"]=",temp[i]}' #NF :number of field,每一行最后一个字段数
-
Conte as conexões tcp de diferentes ips separadamente
netstat -ant | awk '/^tcp/ { n=split($(NF-1),array,":"); #按照:划分,出现结果 两个字段和四个字段 两种情况 if(n<=2) ++S[array[(1)]]; else ++S[array[(4)]]; ++s[$NF];++N } END { for(a in S){ printf("%-20s %s\n", a, S[a]); #向左对齐占20个字节 ++I}c printf("%-20s %s\n","TOTAL_IP",I); for(a in s) printf("%-20s %s\n",a, s[a]); printf("%-20s %s\n","TOTAL_LINK",N); } '
-
Combine a saída de dois arquivos
```c
第一种解法: #FNR每次读取一个文件重新计数
awk 'NR==FNR{name[$1]=$2}NR!=FNR{$2=name[$1];print $0}‘ test2 test2
第二种解法:
merge.awk
{
if(NF==2){
temp1[$1]=$2
}
else if(NF==5){
temp2[$1]=$3
temp3[$1]=$4
temp4[$1]=$5
}
}
END{
for (i in temp1){
printf"%-5s%-6s%-4s%-4s%-4s\n ",i,temp1[i],temp2[i],temp3[i],temp4[i];
}
}
```
-
Folha de pontuação de saída
[root@ ~/test 01:05:51]#cat test.awk BEGIN{ printf "LNO. Name No. Math Eng Com Total\n" printf "----------------------------------------\n" math=0;eng=0;com=0;total=0; } { math+=$3;eng+=$4;com+=$5;total+=$3+$4+$5; printf "%-7s%-7s%-5s%-6s%-5s%-5s%-5s\n", NR,$1,$2,$3,$4,$5,$3+$4+$5; } END{ printf "----------------------------------------\n" printf "%-19s%-6s%-5s%-5s%-5s\n", "Total:",math,eng,com,total; printf "%-19s%-6.1f%-5.1f%-5.1f%-5.1f\n","Avg:",math/NR,eng/NR,com/NR,total/NR; } [root@ ~/test 01:05:51]#awk -f test.awk test
-
O custo operacional da largura de banda CDN de um produto disparou, e sua largura de banda é composta principalmente por vários tipos de imagens. Para otimizar a largura de banda do tráfego de imagens de um produto, é necessário fazer algumas análises nas características de imagem e número do produto. O arquivo de log test.log é para análise e o formato é:
号码|请求大小|请求id ---------------------------------- 001|100|abc.gif 002|80|abd.jpg 003|150|abe.gif 001|60|abf.gif 003|30|abg.jpg -----------------------------------
Onde gif indica uma solicitação para uma imagem gif e um jpg indica uma solicitação para uma imagem jpg. Use (python / shell / awk / sort) para escrever um programa para obter as seguintes ideias de análise (1,2 são etapas intermediárias, você só pode produzir 3. , 4 resultados)
-
Encontre todos os números solicitados por todas as imagens GIF
awk -F"|" '/gif$/{print $1 | "sort -u" }' test
-
Descubra o número total de solicitações para todas as imagens GIF e seus tamanhos de solicitação correspondentes e o número total de solicitações.
awk -F"|" 'BEGIN{printf"no. c sum\n"}/gif$/{++req[$1];temp[$1]+=$2}END{for (i in temp){print i,req[i],temp[i]}}'
-
Encontre o número de todas as solicitações de imagem GIF e classifique-as de acordo com a soma dos tamanhos de solicitação, de grande a pequeno.
awk -F"|" 'BEGIN{printf"no. sum\n"}/gif$/{++req[$1];temp[$1]+=$2}END{for (i in temp){print i,temp[i]|"sort -k2 -nr"}}' test
-
Encontre o número de todas as solicitações de imagem gif e classifique-as pelo tamanho médio da imagem da solicitação.
awk -F"|" 'BEGIN{printf"no. c sum avg\n"}/gif$/{++req[$1];temp[$1]+=$2}END{for (i in temp){print i,req[i],temp[i],temp[i]/req[i]|"sort -k4 -rn"}}' test
-