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 Къде точно?
|
|
|
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 |
|
|
|
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>&- |
|
|
|
97
|
Програмиране / Конкурс bash-майсторът / Задача 3 - 13.11.2007 - 27.12.2007
|
-: Dec 16, 2007, 20:15
|
Още една shell версия: GeSHi (Bash): #!/bin/bash source="$1" dest="$2" export source dest find "${source:=source}" -name '*.mp3' -exec bash -c ' filename="$1" id3 -l "$filename"|while read -r; IFS=: read -r t s ar;IFS=: read -r a al j; do song="${s% Artist}" artist="${ar% }" album="${al% Year}" dst="${dest:=dest}/${artist# }/${album# }" [ -d "$dst" ]||mkdir -p "$dst" mv -v "$filename" "$dst/${artist# } - ${song# }.mp3" done' - {} \;
|
|
|
98
|
Програмиране / Конкурс bash-майсторът / Задача 3 - 13.11.2007 - 27.12.2007
|
-: Dec 14, 2007, 13:44
|
C Awk: GeSHi (Bash): #!/bin/bash shell="/bin/bash" source="$1" dest="$2" ext="$3" export shell source dest ext id3 -l "${source:=source}"/*/*."${ext:=mp3}"|awk 'NR%4 == 1 { fn = substr($0, 1, length-1) next } NR%4 == 2 { sn = $2 an = $4 next } NR%4 == 3 { aln = $2 nd = sprintf("%s/%s/%s/", dest, an, aln) printf "[ -d \"%s\" ]||mkdir -p \"%s\"\n", nd, nd printf "mv \"%s\" \"%s%s - %s.%s\"\n", fn, nd, an, sn, e next }' FS=" : | *|: " dest="${dest:=dest}" e="${ext:=mp3}"|"${shell:=/bin/bash}" exit
<!--EDIT|radoulov|Дек. 14 2007,14:46-->
|
|
|
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
|
|
|
|
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
|
|