Это должно охватывать вас, пока файл соответствует описанию. Команда сохраняет информацию до и после номера телефона и форматирует ее так, как вы просили. Если вывод выглядит хорошо, добавьте параметр -i
к sed
, чтобы отредактировать его на месте, или предоставьте ему перенаправление вывода с помощью > output_file
в конце.
sed -E "s/(.*\t.*\t)\+?1?[[:space:]]?\(?([0-9]{3})\)?.*([0-9]{3}).*([0-9]{4})(.*)/\1\(\2\)\ \3-\4\5/g" filename
Я проверил это на файле, содержащем этот текст:
jfk 902-765-9292 hat jump cat
jk 902 819 2244 hat jump cat
98 902 823-4456 hat jump cat
78h +1 075 242 1566 hat jump cat
jklj kjlj +1 075-242-1566 hat jump cat
jk jkj +1 (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204)-799-9810 hat jump cat
Результат был:
jfk (902) 765-9292 hat jump cat
jk (902) 819-2244 hat jump cat
98 (902) 823-4456 hat jump cat
78h (075) 242-1566 hat jump cat
jklj kjlj (075) 242-1566 hat jump cat
jk jkj (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204) 799-9810 hat jump cat
Вы могли бы сделать
sort /etc/passwd | uniq -c | grep -vE '^ +1 ' | cut -d: -f 7 | sort -u
или все в awk
awk -F: '++count[$1] == 2 {shell[$NF]} END {for (s in shell) print s}' /etc/passwd
Следующая команда будет только сравнивать имя пользователя, игнорируя любые различия в других полях (, например. ид, гид, homedir,shell )и подобрать все оболочки, используемые дублирующими именами пользователей.
grep -f <(cut -d: -f1 /etc/passwd | sort | uniq -d | sed -e "s/^/^/") /etc/passwd | cut -d: -f7 | sort -u