Печать только первого совпадения

У меня есть фрагмент кода, который я использую для анализа файла журнала и для печати необходимой мне информации.

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7}' 
 done;

Проблема заключается в том, когда я вхожу в ввод, он отображает ответ несколько раз:

(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.280.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.283.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109696.2)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109706.51)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109758.100)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109773.149)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109810.198)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109818.247)

Можно ли каким-либо образом обрезать это, чтобы я мог иметь только первая серия отображения данных один раз. Мне нужно только 1.3.51.0.1.1.10.10.30.48.2084865.2084839 распечатать один раз.

Я также попытался изменить его на это, но Bash ему не нравится:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/' |
        awk -F'[(/]' ' {print $2, exit}'
done;

Тогда попробовал это: [ ! d4]

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk -F'[(/]' '/\([a-zA-Z0-9.]+/ {print $2, exit }'
done;
1
задан 25 June 2014 в 22:14

2 ответа

Вам не нужен цикл for - один вызов grep выведет все соответствующие строки из файла, так что вы просто повторяете одну и ту же операцию снова и снова столько раз, сколько строк в файле.

Технически вам не нужны оба awk и grep, так как оба могут выполнять текстовое сопоставление. Если вы хотите получить более конкретный ответ, отправьте вырез из файла журнала и пример того, какой результат вы хотите.

2
ответ дан 24 May 2018 в 06:34
  • 1
    Я не могу этого сделать, некоторые данные в наших журналах чувствительны. – ryekayo 17 June 2014 в 19:41
  • 2
    @ryekayo не точный. Но образец как оригинал. – Avinash Raj 17 June 2014 в 19:48

Вы не объяснили, что вы на самом деле делаете, я сделаю пару предположений. Я предполагаю, что вы запускаете скрипт под названием foo.sh и даете ему строку и имя файла в качестве аргумента. Затем они становятся $1 и $2 соответственно. Предположительно, вы запускаете его с чем-то похожим на

foo.sh SearchPattern LogFileName

. В любом случае цикл for является i) совершенно бесполезным, поскольку вы не используете переменную i, созданную в . ii) очень неправильно, так как это сделает i значение каждого слова, а не всей строки, что вы, вероятно, думаете о iii) причине всех ваших проблем. Вы получаете одни и те же результаты несколько раз, потому что вы используете одну и ту же команду несколько раз. Вы получите один результат для каждой строки вашего файла.

В любом случае, что вы хотите, можно сделать с чем-то простым:

grep "$1" ~/jlog/"$2" | awk '/\([a-zA-Z0-9.]+/ {print $7}' 

Или проще: [!d4 ]

awk '/'"$1"'/\([a-zA-Z0-9.]+/ {print $7}' ~/jlog/"$2"

awk отмечают, что "$1" не находится в одинарных кавычках. Это заставляет bash расширять его до того, что в настоящее время удерживается в $1, прежде чем оно будет передано в awk.

1
ответ дан 24 May 2018 в 06:34
  • 1
    Благодарю. Я смог исправить много ошибок в скрипте, и он работает почти так, как мне нужно сейчас. – ryekayo 17 June 2014 в 23:04
  • 2
    @ryekayo, этот цикл просто заставит его заняться в 3 раза больше времени, чем необходимо, и никоим образом не помогает вам. Он даже не используется вашим скриптом. Заходите в чат, если хотите, и я могу помочь вам еще. – terdon♦ 17 June 2014 в 23:10

Другие вопросы по тегам:

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