2013-05-16 3 views
3

Как передать переменную awk в команду bash в пределах awk?Как передать переменную awk команде bash

Я использую awk для вычисления текущей суммы потоков для каждого из определенных процессов, но затем я хочу использовать каждый pid для доступа к файловой системе /proc/$pid.

Ниже приведена строка с номером , разбитая на, потому что $pid не существует.

Как я могу экспортировать переменную awk pid в команду оболочки, которую я запускаю для запуска awk?

(Разрывы строк добавлены для читаемости)

$ ps -ALf | grep $PROC | grep -v grep | \   # get each pid 
    awk '{threads[$2]+=1} END \     # count num threads per pid 
     { \ 
      for (pid in threads) \ 
       "cat /proc/$pid/cwd"|getline cwd; \ # get 'cwd' (**broken**) 
       print cwd ": " threads[pid] \  # display 'cwd' and num threads 
     }' 
+0

Почему бы не сделать всю работу в awk? – Johnsyweb

+2

Не выполняйте 'grep ... | grep -v ... | awk ...', так как awk может выполнять работу grep (s).В linux вы можете использовать 'ps -C $ PROC' для отображения только определенных процессов (имен). – TrueY

ответ

2

Вы можете сделать всю партию в без каких-либо grep сек ссылке это:

% ps -ALf | awk -v proc="${PROC}" ' 
$0 ~ proc && !/awk/ { 
    threads[$2] += 1 
} 
END { 
    for (pid in threads) { 
     "readlink /proc/" pid "/cwd" | getline dir 
     printf "%d: %d %s\n", pid, threads[pid], dir 
     dir="" 
    } 
}' 

Несколько вещей стоит отметить:

  • -v proc="${PROC}" присваивает переменной окружения ${PROC} к awk переменной , proc
  • "readlink /proc/" pid "/cwd" объединяет ee строки. Оператору конкатенации нет необходимости в awk.
  • dir="" сбрасывает переменную dir, если символическая ссылка не читается в следующий раз вокруг цикла.
2

AWK не делает переменную интерполяции внутри строк, вы просто сцепить переменную со строками (так же, как вы делаете в print заявлении).

awk '{threads[$2]+=1} END     # count num threads per pid 
    { 
     for (pid in threads) 
      ("cat /proc/" pid "/cwd")|getline cwd; # get 'cwd' (**broken**) 
      print cwd ": " threads[pid]  # display 'cwd' and num threads 
    }' 

Вам также не нужны все эти обратные косые черты. Не нужно выводить строки в строке с кавычками (а некоторые из них не были даже перед символами новой строки, после них были комментарии).

4

Вы не можете кошка /proc/$pid/cwd это символическая ссылка на каталог. Один из способов разрешения символических ссылок - readlink от coreutils.

Вот рабочий пример, используя биты из TrueY и Barmer:

ps -C $PROC | 
awk '{ t[$1] } END { for(p in t) { "readlink -f /proc/" p "/cwd" | getline c; print c } }' 

Несколько вещей, чтобы заметить:

  • трубы удваивается как символ продолжения строки.
  • Достаточно обратиться к записи массива для ее создания (t[$1]).
Смежные вопросы