Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: awk, grep и прочие гадости:)  (Прочитано 3002 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
awk, grep и прочие гадости:)
« : 06 Ноябрь 2014, 10:13:08 »
Всем добра! Незнаю даже в какой раздел писать с таким вопросом, решил написать сюда:)
Есть несколько задачек, они должны все решатся из командной строки. Как правило это одна-две строчки на задание. Просто так вышло, что в регулярных выражениях особо не силён, да и всякими штуками типа awk особо не сталкивался, поэтому на только вас вся надежда..

(Нажмите, чтобы показать/скрыть)

файлы query* в архиве, который во вложении.
буду премного благодарен:)
Burning on the flame
Played the waiting game

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 13220
  • Xubuntu 18.04
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #1 : 06 Ноябрь 2014, 12:31:05 »
Задания для того и даются, чтобы их решать самостоятельно, а не выкладывать на форум, чтобы кто-то за вас решил.
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #2 : 06 Ноябрь 2014, 13:35:32 »
Pilot6, это то ясно, что надо самому всё делать, но дело в другом. Мне знания о Linux на таком уровне навряд ли понадобятся, но это уже мой выбор
А насчёт заданий, то проблема в том,что я даже незнаю, с чего начать. использовать типа cut 2- test.txt | paste -d, или ещё что либо, это вообще непонятно, и навряд ли понятно будет
Burning on the flame
Played the waiting game

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 13220
  • Xubuntu 18.04
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #3 : 06 Ноябрь 2014, 13:43:39 »
S9,
Цитировать
то вообще непонятно, и навряд ли понятно будет
Если это правда, то вы неправильно специальность выбрали. Мне это понятно, хоть я не программист, никогда этому не обучался. А вам просто лениво и всё. В сети полно информации. Можно взять и прочитать.
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #4 : 06 Ноябрь 2014, 13:48:57 »
Всё может быть, сейчас тогда попробую сам решить

Пользователь решил продолжить мысль 06 Ноябрь 2014, 16:46:26:
Вдумчиво почитав, есть много вопросов
(Нажмите, чтобы показать/скрыть)
Буду премного благодарен за помощь
« Последнее редактирование: 06 Ноябрь 2014, 16:46:26 от S9 »
Burning on the flame
Played the waiting game

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6013
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #5 : 06 Ноябрь 2014, 22:40:24 »
cut даже по названию вырезает, а Вам надо менять => sed или awk. Или встроенные команды bash с переменными.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн SvMidi

  • Активист
  • *
  • Сообщений: 815
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #6 : 06 Ноябрь 2014, 22:45:46 »
По первому заданию, вот тут http://ru.najomi.org/_nix/sed (тут лучше http://ant0.ru/sed1line.html ,но он что то не работает) много хороших примеров.
2. Читать построчно файлы. Операции сравнения там http://www.opennet.ru/docs/RUS/bash_scripting_guide/x2565.html, запись в файл echo "tratatta" >> file
3. Именно grep, ещё можно к нему -с дописать
4. grep "SALES" даст строки, перебрать циклом, в зависимости от того что в файле получить города sed или ещё что
5. Как второй.
6. Придётся попользоваться.
« Последнее редактирование: 06 Ноябрь 2014, 22:55:32 от SvMidi »
Я знаю только то, что ничего не знаю, остальные не знают и этого.

Оффлайн Vlad.V

  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #7 : 08 Ноябрь 2014, 23:39:03 »
Еще можно погуглить запросом "bash работа со строками" или man sed, awk, wc, tail, head. А вообще согласен с Pilot6, вы уверены,  что Linux и администрирование / программирование это ваше?

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #8 : 09 Ноябрь 2014, 00:55:27 »
По первому заданию, вот тут http://ru.najomi.org/_nix/sed (тут лучше http://ant0.ru/sed1line.html ,но он что то не работает) много хороших примеров.
2. Читать построчно файлы. Операции сравнения там http://www.opennet.ru/docs/RUS/bash_scripting_guide/x2565.html, запись в файл echo "tratatta" >> file
3. Именно grep, ещё можно к нему -с дописать
4. grep "SALES" даст строки, перебрать циклом, в зависимости от того что в файле получить города sed или ещё что
5. Как второй.
6. Придётся попользоваться.
по первому почитал, написано много, но ничего на нашел, как выбрать первые два символа. Пробовал так
sed 's/^../..$/g' text >> outно это просто добавляло перед строкой ..$ и записывало в файл out.

по третьему, то всё ясно, за исключением одного, как регулярным выражением выдернуть 13-й символ из строки?
по четвёртому заданию, то тут проблема с регулярным выражением, как написать, чтобы выделял от 51-го символа и до первой цифры?
по шестому, то регулярное выражение для grep подойдёт также и для awk?

P.S. Не пойму, что сейчас за мания величия разрослась у людей.. Чтобы решить эти задачки, для знающего человека, займёт чуть-чуть времени, но нет, надо же величаво указывать, учи, читай, это тебе пригодится. Но некоторые не могут представить, что это может и абсолютно не пригодится. Уверен, что 90% людей в мире, вполне себе счастливы и без познаний в регулярных выражениях и awk. Вывод один: или человеку лишь потрепать языком, или у самого недостаточная квалификация, чтобы помочь. Это в большей степени касается вас, Pilot6. Не сочтите это за грубость, просто накипело немного. Просто несколько дней сижу, никак не разберусь с задачами.


Пользователь решил продолжить мысль [time]09 Ноябрь 2014, 01:56:09[/time]:
Vlad.V, это моё. Только я программирую на C и для микроконтроллеров, и не сложно догадаться, что эти регулярные выражения, с этим grep и awk совсем ни к чему.
« Последнее редактирование: 09 Ноябрь 2014, 00:57:21 от S9 »
Burning on the flame
Played the waiting game

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6013
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #9 : 09 Ноябрь 2014, 16:37:05 »
S9,
Задания предполагают предварительное изучение теоретического материала и призваны помочь в определении его освоения. Не можете решить значить надо снова вернуться к теории. Какой будет толк если дать Вам готовое решение? Теорию Вы как не знали, так и не узнаете. Ну прочитаете Вы, напримерsed -nE 's/^(..)(.*)(..)$/\3\2\1/wnew.file' source.fileсможете объяснить без знания теории как это работает, а, самое главное, использовать?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #10 : 09 Ноябрь 2014, 22:49:47 »
Azure, в том и дело, что мне надо просто показать задания и сказать по паре слов о их выполнении. И разобрать решённую задачу гораздо легче, нежели написать её с нуля

Пользователь решил продолжить мысль [time]10 Ноябрь 2014, 00:06:08[/time]:
S9,
Задания предполагают предварительное изучение теоретического материала и призваны помочь в определении его освоения. Не можете решить значить надо снова вернуться к теории. Какой будет толк если дать Вам готовое решение? Теорию Вы как не знали, так и не узнаете. Ну прочитаете Вы, напримерsed -nE 's/^(..)(.*)(..)$сnew.file' source.fileсможете объяснить без знания теории как это работает, а, самое главное, использовать?
насчёт кода, предполагаю что
^(..) - это первые два символа
(.*) - это произвольно длины строка
(..)$ - это последние два символа строки
/\3\2\1/w - это записать блоки (по другому я не знаю как назвать эти круглые скобки ^(..)(.*)(..)$ в порядке 3-2-1), т.е. обратном. w - это наверное от слова write, и значит записать в файл new.file
Данные берём из файла source.file
Если я что-то неправильно понял, то поправьте меня


Пользователь решил продолжить мысль 09 Ноябрь 2014, 23:09:12:
Вообщем, разобраться могу, а написать нет.
« Последнее редактирование: 09 Ноябрь 2014, 23:09:12 от S9 »
Burning on the flame
Played the waiting game

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6013
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #11 : 10 Ноябрь 2014, 01:46:03 »
Думаю Вы глубоко заблуждаетесь. Вот 2-е заданиеawk -F"[! ]" '
   /SP JUNIOR RACKET/{t=$1}
   $4==t&&$4!=""{if($NF>s){s=$NF;i=$3}}
   $1==i{print $2}
' query* query* query* | uniq
« Последнее редактирование: 10 Ноябрь 2014, 01:47:56 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #12 : 10 Ноябрь 2014, 08:31:44 »
Azure спасибо большое

P.S. Почему у меня такие предположения насчёт
sed -nE 's/^(..)(.*)(..)$/\3\2\1/wnew.file' source.fileто этот код меняет первые два и последние два символа в файле source.file, а этот код
sed -nE 's/^(..)(.*)(..)$/\1\2\3/wnew.file' source.fileприменённый к изменённому файлу, возвращает его в исходное положение
по крайней мере, то что ^(..) - это первые два символа, (.*) - это произвольно длины строка, (..)$ - это последние два символа строки думаю я прав
Burning on the flame
Played the waiting game

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6013
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #13 : 10 Ноябрь 2014, 13:13:18 »
Ещё раз повторю, задания призваны укрепить и проверить знания. Когда не можешь что-то сделать, лезешь  справочники/интернет/учебники… , восстанавливаешь пробел. И только тогда можешь считать материал изученным и понятым. А насчёт того, надо это Вам лично или нет — вопрос немного философский, лично мне это интересно + доп.знания и умения никогда не лишние. Если Вам нет, то может стоит согласиться с Vlad.V что это не Ваше? Всё-таки программирование это и образ мышления тоже. Вот например 3 варианта 6 заданияawk '
{
 n=length
}
n>3{
 print substr($0,n-1) substr($0,3,n-4) substr($0,1,2)
}
n<=3' new.file
awk '
BEGIN{
 split(n-1 3 1,A,"\0");
 split(2 n-4 2,B,"\0");
}
{
 n=length;
 if(n>4){
  for(i in A)
   printf("%s",substr($0,A[i],B[i]));
   print ""
  }
 else print
}' new.file
awk -F"\0" -v OFS="\0" '
 length>4{
 a=$1;
 b=$2;
 $1=$(NF-1);
 $2=$NF;
 $NF=b;
 $(NF-1)=a
}
1' new.file
Мне было интересно, я тоже не сразу, "на коленке", смог написать работающий код. Но я разобрался, следовательно стал умнее благодаря выполнению заданий, а Вы? Смогли расшифровать код 2-го задания и этот?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн S9

  • Автор темы
  • Участник
  • *
  • Сообщений: 163
  • Волшебник
    • Просмотр профиля
Re: awk, grep и прочие гадости:)
« Ответ #14 : 10 Ноябрь 2014, 14:10:33 »
Ещё раз повторю, задания призваны укрепить и проверить знания. Когда не можешь что-то сделать, лезешь  справочники/интернет/учебники… , восстанавливаешь пробел. И только тогда можешь считать материал изученным и понятым. А насчёт того, надо это Вам лично или нет — вопрос немного философский, лично мне это интересно + доп.знания и умения никогда не лишние. Если Вам нет, то может стоит согласиться с Vlad.V что это не Ваше? Всё-таки программирование это и образ мышления тоже. Вот например 3 варианта 6 заданияawk '
{
 n=length
}
n>3{
 print substr($0,n-1) substr($0,3,n-4) substr($0,1,2)
}
n<=3' new.file
awk '
BEGIN{
 split(n-1 3 1,A,"\0");
 split(2 n-4 2,B,"\0");
}
{
 n=length;
 if(n>4){
  for(i in A)
   printf("%s",substr($0,A[i],B[i]));
   print ""
  }
 else print
}' new.file
awk -F"\0" -v OFS="\0" '
 length>4{
 a=$1;
 b=$2;
 $1=$(NF-1);
 $2=$NF;
 $NF=b;
 $(NF-1)=a
}
1' new.file
Мне было интересно, я тоже не сразу, "на коленке", смог написать работающий код. Но я разобрался, следовательно стал умнее благодаря выполнению заданий, а Вы? Смогли расшифровать код 2-го задания и этот?

во втором, опять же
awk -F"[! ]" '
   /SP JUNIOR RACKET/{t=$1}
   $4==t&&$4!=""{if($NF>s){s=$NF;i=$3}}
   $1==i{print $2}
' query* query* query* | uniq
/SP JUNIOR RACKET/{t=$1} - находим SP JUNIOR RACKET и записываем в переменную t
$4==t&&$4!="" - это наверное проверка, содержится ли SP JUNIOR RACKET в 4-м столбце
{if($NF>s){s=$NF;i=$3}} $1==i{print $2} это найти максимальный элемент и записать его в $1
могу ошибаться
awk '
{
 n=length
}
n>3{
 print substr($0,n-1) substr($0,3,n-4) substr($0,1,2)
}
n<=3' new.file
тут, если длина больше 3, то печатаем строку от 0 до n-1 (т.е. всю), потом вставляем конец строки (точнее два последних символа), это substr($0,3,n-4) и потом первые два символа substr($0,1,2)

Это моё предположение на вскидку, что делает программа, написанная на незнакомом мне языке.

P.S. Azure, если программирование не моё, то Вы, как хороший программист, скажите например, что делает этот код? Этот фрагмент кода (кстати, написанный мною), который запускает в микроконтроллере кое-что. Что именно он запускает? Я даже так Вам упростил задачку.
RST_CLK_HSEconfig(RST_CLK_HSE_OFF);
RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);
RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul5);
RST_CLK_CPU_PLLcmd(ENABLE);
RST_CLK_CPU_PLLuse(ENABLE);
Это язык С.
было бы интересно увидеть ваши предположения.

Пользователь решил продолжить мысль 10 Ноябрь 2014, 14:28:39:
И в третьем задании, где надо найти количество хардлинков в /etc/ у меня проблема в следующем.
делаю так
ls -l /etc/ | cut -d ' ' -f2 | sortно беда в том, что нужные мне цифры (2-й столбец)
-rw-r--r--   1 root root     1343 янв.   9  2007 wodim.conf
drwxr-xr-x   2 root root     4096 окт.  22 09:29 wpa_supplicant
drwxr-xr-x  10 root root     4096 окт.  22 09:29 X11
drwxr-xr-x   7 root root     4096 окт.  22 09:30 xdg
drwxr-xr-x   2 root root     4096 окт.  22 09:30 xml
drwxr-xr-x   2 root root     4096 окт.  22 09:30 xul-ext
-rw-r--r--   1 root root      349 сент. 11 18:18 zsh_command_not_found

отделены в основном на два пробела, и команды выводит только 10 (т.к. он ограничен одним пробелом)
ка сделать, чтобы перед cut преобразовывать пробелы, допустим в табуляции? т.е. надо два пробела перевести в табуляцию, и одиночный пробел тоже перевести в табуляцию.

P.S. Конечно, можете опять говорить, что я бездарь и вообще что забыл в программировании, но позволю себе небольшую поправку на то, что вопросы возникающие в процессе выполнения, задаю на форуме (разве не для этих целей предназначен форум?)
« Последнее редактирование: 10 Ноябрь 2014, 14:28:39 от S9 »
Burning on the flame
Played the waiting game

 

Страница сгенерирована за 0.104 секунд. Запросов: 24.