Мой последний сценарий генерировал txt документ, который включает первые и последние 10 строк /etc/passwd
файл. Я хочу отфильтровать эти 20 строк в файл путем показа мне первых 3 слов в *:*:*
: (где *
=words)
Вот то, что я работал вокруг, и я не мог получить его работа:
#!/bin/bash
echo "**********************************"
echo "Today is: "$(date "+%d%m%Y")
echo "**********************************"
echo "This are the data that last script generated"
echo "**********************************"
echo
echo $(grep *:*:*: /tmp/test-file)
Если необходимо использовать grep
можно соответствовать первым трем полям каждой строки с
grep -o '^[^:]*:[^:]*:[^:]*'
Это соответствует началу строки (^
), затем все кроме двоеточия :
сопровождаемый двоеточием :
и т.д. Благодаря -o
опция, grep
печать только подобранные (непустые) части согласующего отрезка длинной линии, посмотрите man grep
. Вот пример с первыми и последними двумя строками /etc/passwd
:
$ grep -oh '^[^:]*:[^:]*:[^:]*' <(head -2 /etc/passwd) <(tail -2 /etc/passwd)
root:x:0
daemon:x:1
timidity:x:122
geoclue:x:123
Читайте больше об Основных регулярных выражениях (BRE), используемых здесь на https://www.regular-expressions.info/gnu.html.
С тех пор /etc/passwd
список полей, разделенных стабильным разделителем (во многом как CSV), необходимо использовать команды, которые могут работать с ними, как cut
или awk
(для более сложных операций).
В этом случае, cut
достаточно:
cut -d: -f-3
Объяснение:
-d
устанавливает разделитель (или разделитель полей). Мы хотим :
здесь.-f
выбирает поля для печати. -3
означает “до 3-го столбца”.Пример:
$ cut -d: -f-3 /etc/passwd | head
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
lp:x:7
mail:x:8
news:x:9
Между прочим, это является лишним для издания echo $(command)
. Используйте command
непосредственно.
Используя awk:
$ awk -F: 'NR<=20 && NF=3' /etc/passwd
root x 0
daemon x 1
bin x 2
sys x 3
sync x 4
games x 5
...
NR<=20
(NR=number регистра) и NF
к 3 (NF=number полей) Извините за подлость ☺