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


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

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

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

Оффлайн S9

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

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

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

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 14037
  • 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

  • Старожил
  • *
  • Сообщений: 14037
  • 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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • 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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • 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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • 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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • 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.056 секунд. Запросов: 25.