grep с логическими операторами

я пытался получить rx_bytes и tx_bytes, но никакая удача, другие вещи работают.. Таким образом, можно использовать ниже сценария для того же

#!/bin/bash

# /sys/class/net/eth0/statistics/rx_bytes
# /sys/class/net/eth0/statistics/tx_bytes

Process="$1"

[[ -z $2 ]] && InterVal=1 || InterVal=$2

show_help() {
cat <<_EOF
Usage :
        $0  <ProcessName>  <Interval (Default 1s)>
_EOF
}

Show_Process_Stats() {
pgrep "${Process}" >/dev/null 2>&1 || { echo "Error: Process($1) it not Running.."; exit 1;};
while :
do
    # timestamp(unix),cpu_activity(%),mem_usage(B),network_activity(B)
    timestamp=$(date +%s)
    read cpu_activty mem_usage < <( ps --no-headers -o %cpu,rssize  -C "${Process}" )   
    echo "${timestamp}","${cpu_activty}","${mem_usage}"
    sleep $InterVal
done
}


Main() {
case $1 in
        ""|-h|--help)
                      show_help
                      ;;
                     *)
                      Show_Process_Stats
                      ;;
esac                      
}


Main $*
20
05.01.2015, 13:53
6 ответов

С awk , как и с Perl , вам придется обернуть термины в // , но это можно сделать:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 
12
27.01.2020, 19:43

Есть много способов использования GREP с логическими операторами.

  1. Использование \ | для отделения нескольких шаблонов для состояния или .

    Пример: GREP 'Pattern1 \ | Pattern2' filename

  2. Используйте опцию -E , чтобы отправить несколько шаблонов для или условие.

    Пример: Grep -e 'Pattern1 | Pattern2' filename

  3. Использование одного -E соответствует только одному шаблону, но с использованием нескольких -E опция соответствует более одной модели.

    Пример: GreeP-E-Patcher1 -E Pattern2 Имя файла

  4. GREP -V может моделировать работу .

  5. Нет и оператора в GREP , но вы можете грубить Имитация и , используя опцию -E .

    Пример: Grep -e 'Pattern1. * Pattern2 | Pattern2. * Pattern1' Filename

    Приведенный выше примером будет соответствовать всем линиям, которые содержат оба Pattern1 и Pattern2 в любом порядке.)

29
27.01.2020, 19:43

Вы могли бы использовать Perl:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'
4
27.01.2020, 19:43
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

Я верю, что это достигает того, что ты пытаешься сделать. Он dвывел из скрипта любую строку, которая не соответствует сроку1, он bвывел из скрипта (и таким образом автоматически распечатал) любую оставшуюся строку, которая соответствует сроку2, и для остающихся строк он удаляет все, что не соответствует термину3 , а также из тех, которые соответствуют термину4 . Скрипты

sed оцениваются по порядку, и все тесты являются булевыми, поэтому любые действия, полученные в результате теста, будут непосредственно влиять на поведение любых последующих действий.

0
27.01.2020, 19:43

Я использую цепочку grepкоманд для достижения логического И:

grep expr1 filename | grep expr2

Я считаю, что это довольно просто, -похоже на Unix и элегантно.


Затем вы можете комбинировать (, как подробно объяснил @Tushi ), с опцией -Eдля ИЛИ -и -vдля отрицания.

Ваш конкретный пример довольно неприятный и, вероятно, выиграет от какой-нибудь более мощной утилиты (см. ответ @muru ).

0
27.01.2020, 19:43

GNU grep допускает регулярное выражение Perl, поэтому мы можем сделать это, чтобы найти строки, содержащие как слово1, так и слово2.

grep -P '(?=.*word1)(?=.*word2)' filename

(см. этот пост)для более подробной информации.

2
03.08.2020, 20:41

Теги

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