Для тех, у кого возникла такая же проблема... спустя долгое время я смог ее решить.
Я устал пробовать разные вещи, поэтому я удалил как авторизованные ключи _, так и известные _хосты, все, что у меня было, это пустой каталог.ssh. В тот момент я отключился от сервера и думал, что сломал все это, но, поскольку я на Mac, сделав это https://coderwall.com/p/8ag5aq/ssh-broken-pipe-fix-mac-os-x, я смог снова подключиться.
Я просто снова выполняю команду ssh -copy -id с Mac, и она автоматически создает на сервере файл «авторизованные _ключи», но не «известные _хосты».
Только после этого я запустил ssh -i /path/to/MYKEY user@serverIP, и он работал как шарм без запроса пароля.
Любого из них должно быть достаточно для соответствия простым/базовым форматам (, например. без знаков, без показателей )числаINT,FLOAT,FLOAT,CHAR
:
grep -E '^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$' file
sed -En '/^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$/p' file
awk '/^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$/' file
# expect
# 1 2
# 123456789012345678901234567
# 160314591xxxx,48.12,0.0xx,s
grep -Ex '160314591[0-9]{4},48\.12,0\.0[0-9]{2},s' < file.csv
Выполнит строгое сопоставление. Вы можете сделать более или менее строгим то, что именно вы хотите, чтобы оно соответствовало, настроив это регулярное выражение.
Is there a way to find and remove lines that do not fit the format?
Много способов, вот один:
$ perl -n -i.bak -e 'print if /\d{13},\d\d.\d\d,\d\.\d\d\d,s$/' t.dat
$ diff t.dat.bak t.dat
7d6
< 1603145914502,48.12,0.085,s915899,48.12,0.019,s
13d11
< 1459143
$ cat t.dat
1603145914502,48.12,0.085,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
1603145915612,48.12,0.033,s
1603145915899,48.12,0.019,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
1603145915612,48.12,0.033,s
1603145915899,48.12,0.019,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
$
Я склоняюсь к perl до awk/sed, но та же самая операция может быть выполнена с помощью awk почти таким же образом
I would really appreciate if the command could be explained as well so I can learn something from it.
Пояснение
-n
перебирать строки из файла, но не выводить их в STDOUT -i
отредактируйте файл в -месте -i.bak
и сохранить резервную копию с указанным расширением имени файла на случай, если я совершу ошибку! -e 'script'
запускать команды в скрипте (для каждой строки ввода, начиная с -n опции)print if...
вывести строку, если она соответствует условному выражению /... /
-используйте это регулярное выражение для сопоставления с шаблоном -^
в начале строки... \d
соответствует цифре {3}
соответствует ровно трем ранее указанным символам ,
соответствует буквальному символу запятой \.
соответствует буквальному символу остановки (в противном случае .
является подстановочным метасимволом)s
соответствует буквальному символу s $
соответствует концу строки (, т. е. в строке не должно быть других символов. Более гибким выражением было бы `^\d+,\d+.\d+,\d+.\d+,[a -zA -Z]$
+
хотя бы один из предыдущих символов [...]
один из указанного набора [a-z]
любой символ ASCII нижнего регистра от a до z включительно [[:alpha:]]
любой символ из алфавитного набора POSIX \p{Lowercase_Letter}
любой символ Unicode со свойством строчная буква Регулярные выражения Perl немного отличаются от регулярных выражений, используемых в awk/grep. Я думаю, что в современных версиях awk/grep есть возможность использовать регулярные выражения в стиле perl.См. справочную страницу для параметра grep -P