У меня есть фрагмент кода, который я использую для анализа файла журнала и для печати необходимой мне информации.
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;
Вам не нужен цикл for - один вызов grep выведет все соответствующие строки из файла, так что вы просто повторяете одну и ту же операцию снова и снова столько раз, сколько строк в файле.
Технически вам не нужны оба awk и grep, так как оба могут выполнять текстовое сопоставление. Если вы хотите получить более конкретный ответ, отправьте вырез из файла журнала и пример того, какой результат вы хотите.
Вы не объяснили, что вы на самом деле делаете, я сделаю пару предположений. Я предполагаю, что вы запускаете скрипт под названием 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.