Combate real do problema da linguagem Linux Awk (dificuldade crescente)

Perguntas do teste escrito em Linux sobre problemas de linguagem Awk (dificuldade crescente)

Tópico (mais prática, mais prática, mais prática, sem atalhos)

  1. 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   #关系表达式考察
    
  2. 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 #关系表达式考察
    
    
  3. 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 #~指的是 正则于
    
  4. 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 #模式考察
    
  5. Conte o número total de linhas de texto

    END{
          
          print NR} #num of record #模式考察还有记录内置变量NR
    
  6. Mostrar nome do arquivo

    END{
          
          print FILENAME}  #不能在过程处理中输出
    
  7. 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  #判断语句考察
    
  8. Use awk para simular tail -l

    END{
          
          print $0}  #输出整行 
    
  9. 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,每一行最后一个字段数
    
  10. 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);
    }
    '
    
  11. Combine a saída de dois arquivos

Insira a descrição da imagem aqui

```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];
	}
}

```
  1. Folha de pontuação de saída

    Insira a descrição da imagem aqui

    [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
    
  2. 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
      

Acho que você gosta

Origin blog.csdn.net/weixin_31789689/article/details/107970594
Recomendado
Clasificación