Как использовать разделители табуляции с grep в сценарии ash или dash?

Задача под рукой:

У меня есть файл с четырьмя значениями, разделенными табуляцией:

peter 123   five   apples
jane  1234  four   rubberducks
jimmy 01234 seven  nicknames

Мне нужно получить строку из этого файла на основе второго столбца, а значение находится в переменной. Давайте предположим, что у меня есть номер 123, хранящийся в переменной foo. В Bash я могу сделать

grep $'\s'$foo$'\s'

и я получаю информацию Питера и ничего больше. Есть ли способ добиться того же на приборной панели или золе?

2 ответа

Решение

Ты можешь использовать awk Вот:

var='1234'
awk -v var="$var" '$2 == var ""' f
jane  1234  four   rubberducks

PS: я делаю var "" Чтобы убедиться var обрабатывается как строка, а не как число.

Если ваш файл настолько мал, что неэффективность выполнения итерации в оболочке не имеет значения, вам на самом деле не нужно grep для этого вообще. Следующее действительно в любой POSIX-совместимой оболочке, включая пепел или тире:

var=123
while read -r first second rest; do
  if [ "$second" = "$var" ]; then
    printf '%s\t' "$first" "$second"; printf '%s\n' "$rest"
  fi
done

(На практике я, вероятно, использовал бы здесь awk; рассмотрим демонстрацию именно этого).

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