Печать последний столбец, содержащий пробелы и специальные символы

Мне нужен полный путь/, управляют, чтобы это было execued для запуска процесса, это выставляется в сети - слушает на tcp/udp. Мне действительно удавалось получить все то использование ниже "одного лайнера":

netstat -nlp46|tail -n +3 |   while IFS=" " read -r -a line; 
do nb=${#line[@]}; 
PID=$(echo ${line[$((nb - 1))]} | awk -F'/' '{print $1}'); 
CMD=$(ps -ef|awk '$2 == '"$PID" |awk -F" " '{out=$8; for(i=9;i<=NF;i++){out=out""$i}; print out}');
echo $PID^$CMD; 
done

но когда процесс содержит некоторые специальные символы в командной строке, например, тонкий сервер, сценарий имеет некоторые проблемы со следующей ошибкой

awk: line 1: missing ) near end of line

когда я действительно выполнял часть сценария против того процесса, у меня не было проблем

root@ftp-host02:~# PID=15000; COMMAND=$(ps -ef|awk '$2 == '"$PID" |awk '{out=$8; for(i=9;i<=NF;i++){out=out" "$i}; print out}'); 
echo $COMMAND

thin server (0.0.0.0:3000)

Что я делаю неправильно здесь?

Спасибо

0
задан 21 April 2015 в 22:18
2 ответа

Ошибка здесь: awk '$ 2 ==' "$ PID"

  • если $ PID не является строго числовым, то вы делаете проверка равенства для строки без кавычек, так что, действительно, кто знает, как awk ее интерпретирует?

     $ PID = "3000)"
     $ echo привет |  mawk '$ 2 ==' "$ PID"
    mawk: строка 1: extra ')'
     

Передача переменной оболочки в awk как переменной awk (с параметром -v ) очищает это.

Очистив ваш код другими способами, мы имеем:

netstat -nlp46 | 
tail -n +3 | 
while IFS=" " read -r -a fields; do 
    nb=${#fields[@]}
    PID=${fields[nb-1]%%/*}
    CMD=$( ps -ef | awk -v pid="$PID" '$2 == pid {out=$8; for(i=9;i<=NF;i++){out=out $i}; print out}' );
    echo "$PID^$CMD"; 
done

Примечания:

  • правильный отступ имеет большое значение для чтения кода
  • индекс массива с числовым индексом уже вычислен в арифметическом контексте, поэтому $ {ary [n-1]} будет работать
  • Вы можете удалите косую черту и все последующие символы с помощью расширения параметра оболочки, поэтому вам не понадобится awk для получения PID
  • , вам не нужно перенаправлять awk в awk: консолидировать
  • передать переменную оболочки в awk с помощью -v option
2
ответ дан 4 December 2019 в 13:50

Не могли бы вы попробовать это:

для i в $ (netstat -atnp | awk '{print $ 7}' | grep ^ [0-9] | awk -F \ / '{print $ 1}'); do echo "PID: $ i" $ (ps faxuwwww | grep $ i); done

0
ответ дан 4 December 2019 в 13:50

Теги

Похожие вопросы