Покажи Публикации - radoulov
* Виж публикациите на потр. | Виж темите на потр. | Виж прикачените файлове на потр
Страници: 1 ... 5 6 [7] 8
91  Програмиране / Общ форум / Re: Помощ за един лесничък скрипт -: Dec 27, 2008, 20:37
Аз лично, не мога да разбера въпроса ...

Цитат
However it is possible to write this in one line (without error checking) using regular expressions

?

Регулярните изрази извършват matching, не substitution.

Цитат
Below is a template, can you fill in the regular expression

Къде точно?

Код:
expr `echo $* | sed ''`
92  Програмиране / Общ форум / Bash script за следене съдържанието на директория -: Mar 04, 2008, 13:43
Примерен код
#! /usr/bin/env bash

(($#!=2))&&{ printf "Usage: $0 <dir> <email>\n"; exit 1;}

oldstat="/tmp/_old.stat"

[ -f "$oldstat" ]||>"$oldstat"

[ "$(stat --printf "%y" "$1")" = "$(<"$oldstat")" ]||echo|mailx -s "modified" "$2"

printf "%s" "$(stat --printf "%y" "$1")">"$oldstat"

exit


Кодът не контролира за промени в subdirectories!



93  Програмиране / Общ форум / Помощ за grep -: Feb 13, 2008, 14:56
Цитат (console @ Фев. 13 2008,15:26)
Погледнете следната ситуация:
Примерен код
grep 227 file
199227 Ivan
227  Dragan


Тук целта ми е да извлека само реда който съдържа 227 т.е.
Примерен код
grep 227
227 Dragan


Примерен код
grep '^227 ' file


Цитат
Примерен код
cat file
227 Dragan Sofia Mladost


И това също ще е в bash и ще има за цел да извлече само буквите.


Примерен код
% cat file
227 Dragan Sofia Mladost
% grep -o '[^0-9 ][^0-9]*$' file
Dragan Sofia Mladost
% cut -d" " -f2- file
Dragan Sofia Mladost


C zsh:

Примерен код
% print ${${$(<file)//[0-9]}# }
Dragan Sofia Mlados




94  Програмиране / Общ форум / Помощ за скрипт -: Feb 08, 2008, 23:16
Разбира се,
няколко задължителни (по мое мнение) четива:

Bruce Barnett's tutorials on UNIX shell programming and various other arcane subjects

Advanced Bash-Scripting Guide by Mendel Cooper

За по-напреднали:

Effective AWK Programming by Arnold Robbins

A User's Guide to ZSH

Надявам се да са ти полезни,
както бяха (и все още са) за мен.

P.S. Изключително са важни и някой форуми и news groups,
но не знам, дали е уместно да поствам подобни линкове тук.
95  Програмиране / Общ форум / Помощ за скрипт -: Feb 07, 2008, 13:15
Цитат (never_mind @ Фев. 06 2008,17:42)
Да, прав си, но аз по принцип обичам всичко да е максимало оптимизирано и правилно написано.

В такав случай използвай повече shell и по-малко external utilities:

Примерен код
umask 022

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

while read a y p i ip mask f;do
    [ "$p" = "permit" ]&&printf "%s/%s\n" "$ip" "$({ read;printf "${REPLY##* }";}\
    < <(calcmask wildcard "$mask"))"
done< <(curl -s http://www.nat.bg/look/AS/ip-access-src.txt)>/etc/bgpeering


P.S. Ако имаш bash compiled с --enable-net-redirections можеш да пробваш без curl/wget:

Примерен код
umask 022

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

exec 3<>/dev/tcp/www.nat.bg/80

printf "GET /look/AS/ip-access-src.txt HTTP/0.9\n\nConnection: close\n">&3

while read a y p i ip mask f;do
   [ "$p" = "permit" ]&&printf "%s/%s\n" "$ip" "$({ read;printf "${REPLY##* }";}\
   < <(calcmask wildcard "$mask"))"
done<&3>/etc/bgpeering

exec 3>&-




96  Програмиране / Конкурс bash-майсторът / Задача 4 - 23.01.2008 - 06.02.2008 -: Feb 01, 2008, 21:59
Примерен код

#! /bin/bash

net=(192.168.17.{0..24})
portlist=(21 80 111 139)

for h in "${net[@]}";do
    for p in "${portlist[@]}";do
        nc -nzw1 "$h" "$p"&&printf "host %s: port %s is open\n" "$h" "$p"
    done
done




97  Програмиране / Конкурс bash-майсторът / Задача 3 - 13.11.2007 - 27.12.2007 -: Dec 16, 2007, 20:15
Още една shell версия:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. source="$1"
  4. dest="$2"
  5. export source dest
  6.  
  7. find "${source:=source}" -name '*.mp3' -exec bash -c '
  8.     filename="$1"
  9.     id3 -l "$filename"|while read -r; IFS=: read -r t s ar;IFS=: read -r a al j; do
  10.          song="${s%                          Artist}"
  11.          artist="${ar%                      }"
  12.          album="${al%                         Year}"
  13.          dst="${dest:=dest}/${artist# }/${album# }"
  14.          [ -d "$dst" ]||mkdir -p  "$dst"
  15.          mv -v "$filename" "$dst/${artist# } - ${song# }.mp3"
  16. done' - {} \;
98  Програмиране / Конкурс bash-майсторът / Задача 3 - 13.11.2007 - 27.12.2007 -: Dec 14, 2007, 13:44
C Awk:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. shell="/bin/bash"
  4. source="$1"
  5. dest="$2"
  6. ext="$3"
  7.  
  8. export shell source dest ext
  9.  
  10. id3 -l "${source:=source}"/*/*."${ext:=mp3}"|awk 'NR%4 == 1 {
  11.        fn = substr($0, 1, length-1)
  12.        next
  13. }
  14. NR%4 == 2 {
  15.        sn = $2
  16.        an = $4
  17.        next
  18. }
  19. NR%4 == 3 {
  20.        aln = $2
  21.        nd = sprintf("%s/%s/%s/", dest, an, aln)
  22.        printf "[ -d \"%s\" ]||mkdir -p \"%s\"\n", nd, nd
  23.        printf "mv \"%s\" \"%s%s - %s.%s\"\n", fn, nd, an, sn, e
  24.        next
  25. }' FS="  : |   *|: " dest="${dest:=dest}" e="${ext:=mp3}"|"${shell:=/bin/bash}"
  26.  
  27. exit




<!--EDIT|radoulov|Дек. 14 2007,14:46-->
99  Програмиране / Общ форум / Автоматичен отговор -: Dec 07, 2007, 19:36
Примерен код
start_script< <(yes Y)


'<img'>



100  Програмиране / Общ форум / проверка за по-нови файлове от скрипт? -: Nov 13, 2007, 23:55
Цитат (mars @ Ноември 13 2007,15:48)
Целта ми е да мога в баш скрипт да направя:

if (dir1 contains file newer than 19:30)
do something

Как може да стане това?

Примерен код

touch -t $(date +%Y%m%d"1930") mycheck

for f in dir1/*;do
     [ "$f" -nt mycheck ]&&\
     { <your code here>;break;}
done





101  Програмиране / Общ форум / Bash:  помощ за действие оператор -: Aug 27, 2007, 16:23
Цитат (sandman_7920 @ Авг. 27 2007,15:53)

Проблема ти е главно в това, че не подаваш правилно scale на bc-то
Трябва да ползваш "echo -e" това ти дава право на expression в баш общо-взето да можеш да му кажеш къде да има enter

a=`echo -e "scale=2\n9/10"|bc`
echo $a

Това ти дава .90 до втория знак.
[...]


";" би трябвало да е достатъчно:

Примерен код
$ a=`echo "scale=2;9/10"|bc`;echo $a
.90
$ a=`echo "scale=3;9/10"|bc`;echo $a
0.900


Цитат

Примерен код
a=`echo $a|replace . ,` - това сменя '.' с ','



Или директно с parameter expansion (bash, ksh93 и zsh):

Примерен код
$ a=$(echo "scale=5;562.207763/134.243935"|bc)
$ echo $a
4.18795
$ printf "%.2f\n" ${a/./,}
4,19


Но трябва да се внимава с locale-a:

Примерен код
$ a=$(echo "scale=5;562.207763/134.243935"|bc)
$ LC_ALL=it
$ printf "%.2f\n" ${a/./,}
4,19
$ LC_ALL=C
$ printf "%.2f\n" ${a/./,}
4.00




102  Програмиране / Общ форум / Bash:  помощ за действие оператор -: Aug 26, 2007, 14:12
Цитат (kid @ Авг. 26 2007,14:35)
Нещо не става при мен...:huh:
[kid@xxl-44e57356ff1 ~]$ printf "%0.1f\n" $(echo "9/10"|bc -l)
bash: printf: .90000000000000000000: invalid number
0,0
[kid@xxl-44e57356ff1 ~]$

Taka:

Примерен код
(LC_ALL=C;printf "%0.1f\n" $(echo "9/10"|bc -l))


Може би, така ще е по-бързо (по идея на Chris F.A. Johnson, с изменения):

Примерен код
bash 3.2.13(1) $ calc () { awk 'BEGIN{printf "%.1f\n",'"$1"';exit}'; }
 bash 3.2.13(1) $ calc 9/10
0.9




103  Програмиране / Общ форум / Bash:  помощ за действие оператор -: Aug 26, 2007, 12:04
Цитат (kid @ Авг. 25 2007,19:03)
2-рият ми въпрос е за дейсвие "/" при което резултата е по-малък от 0
Примерни имам число(стойност) 9 кето искам да раздяля на 10
ето какво правя:
echo "scale=1; 9 / 10" | bc
но вместо резултата да е 0.9 излиза .9
ако пък го напиша така:
echo "$((9 / 10))"
резултата е 0
Въпроса ми е как трабва да се напише за да ми излизат резултатите както си му е реда... 0.1 , 0.2 , 0.3.... и т.н.
Благодаря предварително.

Примерен код
bash 3.2.13(1) $ printf "%0.1f\n" $(echo "9/10"|bc -l)
0.9


zsh:
Примерен код
zsh 4.3.4 % printf "%0.1f\n" $((9./10))
0.9




104  Програмиране / Общ форум / изключване на повтарящи думи в текст. -: Apr 23, 2007, 11:04
GNU Awk версия (тъй-като сме на Linux и можем да си позволим този лукс  :o)):

Примерен код
awk 'NF&&!x[$0]++' RS="[ \n]" inputfile
105  Програмиране / Общ форум / Shell скрипт за актуализация на папка -: Feb 11, 2007, 13:51
Цитат
По ей този случай ще дръпна още едно обяснение, пък дано схванеш
for i in dir2/*;do
cp -u dir1/"${i##*/}" dir2
Ако dir2 = /home/user/papka2, a dir1 = /home/user/papka1, то при изпълнението на командата cp -u dir1/"${i##*/}" dir2, скрипта ще изпълни команда
cp -u /home/user/papka1//home/user/papka2/file /home/user/papka2
Както се сещаш, папка /home/user/papka1//home/user/papka2 не съществува. Няма повече да се занимавам с тази тема



Че моят пост е неуместен тук: съмнение вече няма.  
Това, с което не мога да се примиря, е тази нелепа неграмотност и арогантност.
За тези, които искат да научат базите на shell scripting,
показвам:

positional parameters and variable expansion

Примерен код

$ ls -l dir2
total 0
-rw-r--r-- 1 Administrator None 0 Feb  9 18:23 file1
-rw-r--r-- 1 Administrator None 0 Feb  9 18:23 file2

$ set -- dir2/*

$ echo "${@}"
dir2/file1 dir2/file2

$  echo "${@##*/}"
file1 file2

$ for i; do # "for i" bez argumenti, tryabva li da obyasnyavam i tova :)?
>  echo "[izhod] Tova, koeto neter ne moje da razbere, novoto ime shte e: ${i##*/}"
>  echo "[izhod] A komandata copy shte bude: cp -u dir1/${i##*/} dir2"
> done
[izhod] Tova, koeto neter ne moje da razbere, novoto ime shte e: file1
[izhod] A komandata copy shte bude: cp -u dir1/file1 dir2
[izhod] Tova, koeto neter ne moje da razbere, novoto ime shte e: file2
[izhod] A komandata copy shte bude: cp -u dir1/file2 dir2



Няма да обяснявам и защо е по-ефикасно без for loop (изглежда, че ще е твърде advanced:)).

Поздрави,
Димитър

P.S. Моят пост беше насочен към тези, които бяха отговорили, не към Radev, за него, преполагам, ще е по-лесно да разбере неефикасните решения.



Страници: 1 ... 5 6 [7] 8