Получить значение из указанного c столбца в Linux - PullRequest
0 голосов
/ 05 февраля 2020

У меня проблема с получением значений из указанного столбца c в текстовом файле с помощью команды awk. Это текстовый файл sample.txt:

      Apps                  Command            Status            From           
--------------------------------------------------------------------------------
abc-admin          vwxyz -g daemon off;        Up      1.2.3.4:82->80/tcp       
abc-app            vwxyz -g daemon off;        Exit 0  1.2.3.4:83->80/tcp       
abc-docs           aaaaaa-xxxxxxxxxx.sh        Up      1.2.3.4:3001->3000/tcp   
                   /bin/ ...                                                    
abc-mail           aaaaaa-xxxxxxxxxx.sh asd    Exit 1  1.2.3.4:3011->3000/tcp   
                   r ...                                                        
abc-encr           java -cp app:app/lib/*      Up      1.2.3.4:3011->8080/tcp   
                   enc ...                                                      
abc_admin          aaaaaa-xxxxxxxxxx.sh node   Up      1.2.3.4:3012->3000/tcp   
                   .                                                            
abc_bat            /bin/sh -c ./jkl-           Exit 2  1.2.3.4:3013->3000/tcp   
                   yyyyyyyy. ...                                                
abc_conn           /bin/sh -c ./jkl-           Up      3000/tcp                 
                   yyyyyyyy. ...                                                
abc_cust           /bin/sh -c ./jkl-           Up      1.2.3.4:3001->3000/tcp   
                   yyyyyyyy. ...                                                
abc_exp            ads start                   Up      1.2.3.4:3008->3000/tcp   
abc_gw             node .                      Up      1.2.3.4:8080->3200/tcp,  
                                                       80/tcp                   
abc_logs           /usr/local/bin/aaaaaa-      Up      1.2.3.4:5000->5000/tcp,  
                   entr ...                            5044/tcp,                
                                                       1.2.3.4:9600->9600/tcp   

Я пробовал с awk '/abc/ {print $1,$3}' sample.txt, но он дает такой вывод:

abc-admin -g
abc-app -g
abc-docs Up
abc-mail npm
abc-encr -cp
abc_admin node
abc_bat -c
abc_conn -c
abc_cust -c
abc_exp start
abc_gw .
abc_logs Up

Я только что понял, что разделитель между столбцами не вкладка (\ t). Есть ли другой способ получить значения из 1-го и 3-го столбца? Ожидаемый результат:

abc-admin Up
abc-app Exit 0
abc-docs Up
abc-mail Exit 1
abc-encr Up
abc_admin Up
abc_bat Exit 2
abc_conn Up
abc_cust Up
abc_exp Up
abc_gw Up
abc_logs Up

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

1-е решение: Не могли бы вы попробовать, протестировать и написать с предоставленными образцами.

awk '
FNR>2 && /^[^ ]/{
  if($(NF-1)~/[0-9]/){
    print $1,$(NF-2),$(NF-1)
  }
  else{
    print $1,$(NF-1)
  }
}
'  Input_file

Я также считал, что ваше последнее поле НЕ с пробелами.



2-е решение: Учитывая, что в вашем последнем поле могут быть пробелы, в этом случае можно попробовать следующие.

awk '
FNR>2 && /^[^ ]/{
  match($0,/ +[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+.*/)
  val=split(substr($0,1,RSTART-1),array," ")
  if(array[val]~/[0-9]/){
    print $1,array[val-1],array[val]
  }
  else{
    print $1,array[val]
  }
}
'  Input_file

В обоих моих решениях я считал, что exit будет иметь цифру в статусе, что я считаю справедливым соображением.

0 голосов
/ 05 февраля 2020

У вас есть фиксированные поля ширины. Использование GNU awk для указания ширины поля с помощью FIELDWIDTHS, а затем gensub () для удаления посторонних пробелов между ними:

$ awk -v FIELDWIDTHS="19 28 8 *" 'NR<3{next} $1~/[^ ]/{print gensub(/ +/," ","g",$1" "$3)}' file
abc-admin Up
abc-app Exit 0
abc-docs Up
abc-mail Exit 1
abc-encr Up
abc_admin Up
abc_bat Exit 2
abc_conn Up
abc_cust Up
abc_exp Up
abc_gw Up
abc_logs Up
...