Почему не работает этот xargs? - PullRequest
0 голосов
/ 04 июля 2018

Я пытался получить все значения в Redis DB, используя Redis-Cli. Это делается в принципе с помощью redis-cli keys "*" (возвращает все ключи) и передает его на redis-cli get (возвращает значение ключа).

С тех пор я обнаружил (на SO) способ сделать это:

echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli

Но раньше я пробовал это, и команда get никогда не выполнялась. Я неправильно делаю xargs?:

redis-cli keys "*" | xargs -0 -I % redis-cli get "%"

Я ценю то, что вопросы «почему не работали» не одобряются, но я думаю, что ответ будет информативным для людей, смущенных xargs.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я думаю, вы хотите это:

# Set some data
redis-cli set mb1 A
OK

# Set some more
redis-cli set mb2 B
OK

# Check the keys we have
redis-cli keys "mb*"
1) "mb1"
2) "mb2"


#Retrieve those puppies, passing one at a time with "-n 1"
redis-cli keys "mb*" | xargs -n 1 redis-cli get 
"A"
"B"
0 голосов
/ 04 июля 2018

Вы используете флаг -0 для xargs, который говорит, что ваши элементы ввода заканчиваются нулевым символом (ASCII 0), а не пробелом. Вряд ли команда redis-cli выводит ключи в этом формате. На самом деле, кажется, что выводит один ключ / строку, например:

# redis-cli keys "*"
_tooz_group:central-global
_tooz_beats:38225c46-7ed8-4c2a-b1eb-6400d0f99004
_tooz_beats:bea903f7-ab5d-4503-be19-f2029beece93
_tooz_beats:bd859c91-0245-45cf-a289-23fc25998e97
_tooz_beats:04528af5-dd97-41af-87a6-d7dc0c0d9f5d
_tooz_beats:974b9d9d-86ff-457e-9a5c-e857ec12a915
_tooz_beats:a55cfe65-f344-4ed4-9b9f-a0ace4d8f6d3

Если вы уроните -0 из вашего xargs вызова, он должен работать штраф:

# redis-cli keys "*" | xargs -I% redis-cli get %

Если у вас есть ключи, содержащие пробелы, это не сработает (потому что xargs ожидает, что ваши входные данные будут разделены пробелами). В этом В этом случае вы можете явно установить разделитель на \n:

# redis-cli keys "*" | xargs --delimiter '\n' -I% redis-cli get %
...