Актуальная проблема языка Linux Awk (возрастающая сложность)

Письменные тестовые вопросы Linux для языковых проблем Awk (возрастающая сложность)

Тема (больше практики, больше практики, больше практики, без ярлыков)

  1. Обрабатывать только строки с нечетным идентификатором пользователя и печатать имя пользователя и номер uid

    awk -F: '$3%2==1{print $1 $3}' /etc/passwd   #关系表达式考察
    
  2. Отображение обычных пользователей системы и печать имени и идентификатора пользователя.

    awk -F: '$3>=1000{print $1 $3}' /etc/passwd #关系表达式考察
    
    
  3. Отображение обычных пользователей системы и печать имени и идентификатора пользователя.

    awk -F: '$7~/\/bin\/bash$/{print $1,$3}' /etc/passwd #~指的是 正则于
    
  4. Подсчитайте количество обычных пользователей

    awk -F: '$3>=1000{++count}END{print count}' /etc/passwd #模式考察
    awk -F: '$3>=1000{++count| "wc -l"}' /etc/passwd #模式考察
    
  5. Подсчитайте общее количество строк текста

    END{
          
          print NR} #num of record #模式考察还有记录内置变量NR
    
  6. Показать имя файла

    END{
          
          print FILENAME}  #不能在过程处理中输出
    
  7. Отображение информации о пользователях с UID 1002

    awk -F: 'if($3==1002)system("id $1")' /etc/passwd  #判断语句考察
    awk -F: '$3==1002{print $0}' /etc/passwd  #判断语句考察
    
  8. Используйте awk для имитации tail -l

    END{
          
          print $0}  #输出整行 
    
  9. Подсчитайте количество tcp-ссылок

    netstat -ant|awk '/^tcp/{++temp[$NF]}END{for (i in temp) print "temp[",i,"]=",temp[i]}' #NF :number of field,每一行最后一个字段数
    
  10. Подсчитайте tcp-соединения разных IP-адресов отдельно

    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. Объединить вывод двух файлов

Вставьте описание изображения сюда

```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. Выходной оценочный лист

    Вставьте описание изображения сюда

    [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. Стоимость использования полосы пропускания CDN для продукта резко возросла, и ее пропускная способность в основном состоит из различных типов изображений. Чтобы оптимизировать пропускную способность трафика изображения продукта, необходимо провести некоторый анализ характеристик изображения и числа продукта. Файл журнала test.log предназначен для анализа и имеет следующий формат:

    号码|请求大小|请求id
    ----------------------------------
    001|100|abc.gif
    002|80|abd.jpg
    003|150|abe.gif
    001|60|abf.gif
    003|30|abg.jpg
    -----------------------------------
    

    Где gif указывает на запрос изображения gif, а jpg указывает на запрос изображения jpg. Используйте (python / shell / awk / sort), чтобы написать программу для реализации следующих идей анализа (1,2 - промежуточные шаги, вы можете вывести только 3. , 4 результатов)

    • Найдите все числа, запрошенные всеми изображениями в формате GIF

      awk -F"|" '/gif$/{print $1 | "sort -u" }' test
      
    • Узнайте общее количество запросов для всех изображений gif и соответствующие им размеры запросов, а также общее количество запросов.

      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]}}' 
      
    • Найдите количество всех запросов изображений gif и отсортируйте их по сумме размеров запросов от большого к маленькому.

      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
      
    • Найдите количество всех запросов изображений gif и отсортируйте их по среднему размеру изображения запроса.

      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
      

рекомендация

отblog.csdn.net/weixin_31789689/article/details/107970594