Я намагаюся отримати кожну команду grep, щоб виділити її результати іншим кольором. Я можу це зробити вручну з такою лінією:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
Кожен c
символ буде виділений зеленим кольором, а кожен o
символ буде виділено червоним кольором тощо.
Щоб цей приклад працював, вам потрібно забезпечити, щоб ви завжди мали
--color=always
свої команди grep. Я встановив це в моєму,.bashrc
так що греп завжди матиме кольори:
export GREP_OPTIONS='--color=always'
Що я намагаюся досягти, це обернути цю функціональність псевдонімом, щоб я міг просто зателефонувати grep
та мати різну GREP_COLORS
цінність кожного разу. Я розумію розгляд декількох оболонок для кожної нової грейпи, і я намагаюся досягти цього, створюючи деякі файли (по одному для кожного кольору), щоб вказати, що вони вже використовувались.
Я робив кілька спроб, але як не дивно, цей, здається, працює "найкраще". У мене це є .bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
Я використовую цей псевдонім так:
ll | mg c | mg o | mg n | mg f
Результати досить класні. Однак є деякі помилки, які щоразу дещо відрізняються. Ось кілька скріншотів:
Схоже, як оболонка проходить через кожну команду труби, попередня функція ще не закінчила її виконання. Він намагається видалити файли, які вже не існують. Я не надто впевнений, звідки command not found
беруться інші помилки.
Як бачите, я вклав декілька wait
команд, щоб спробувати дозволити маніпуляцію файлом завершено, але це, здається, не надто добре. Ще я спробував використовувати спільну пам’ять, /dev/shm
але це дало подібні результати.
Як би я пішов про отримання бажаних результатів?
Примітка:
Я шукаю відповіді, які просто перетягують команду grep, оскільки вона має багато функціональних можливостей, які я хочу використати, і я маю намір вставити іншу логіку між трубами, тому не хочу вводити відразу всі пошукові терміни. Я також не шукаю інших "греп-подібних" інструментів. Вибачте від @terdon, який уже опублікував приголомшливу пропозицію за перл .
alias mg="mygrep; grep"
?
mygrep;
перетворюється на нову команду сама по собі і потік даних втрачається. Вхідна труба з боку ls
буде проходити в mygrep;
та не грепати. Принаймні так я це розумію.
--color=always
всі ваші команди grep. Я це встановив у всьому світі .bashrc
. Я це відредагував у публікації.