最近このスレを知りました。
>19 14さんのgomiスクリプトを一つにまとめてみました。
2番煎じの上に無駄に長いですが。よかったらどうぞ。
ungomiをパスを含めても指定出来るようにしたんですが。
begin 664 gomi
M(R$O8FEN+V)A<V@*"G9E<G-I;VX](C`N,"XR(@II9B!;("UZ("140D]8(%T[
M=&AE;@H@(%1"3U@])$A/344O=')A<V@*9FD*"G5S86=E*"D*>PH@("`@("`@
M(&5C:&\@(B0P(%MO<'1I;VYS72(*("`@("`@("!E8VAO("(@9FEL90DD5$)/
M6"`\+2!F:6QE("(*("`@("`@("!E8VAO("(@+74@:60)9FEL92AI9"D@/"T@
M)%1"3U@B"@EE8VAO("(@+6P);&ES="!U<"!S8W)A<"!F:6QE<R!I;B`D5$)/
M6"X@(@H)96-H;R`B("UH"7-H;W<@=&AI<R!H96QP+B(*"65C:&\@(B`M=@ES
M:&]W('9E<G-I;VXN(@H)96-H;PH)96-H;R`B=')A<VAB;W@@:7,@)%1"3U@B
M"@D*"65X:70@)#$*?0H*("`@(&-A<V4@)#$@:6X*("`@("UV?"TM=F5R<VEO
M;BD*("`@("`@("!E8VAO("(D,"!V97)S:6]N("(D=F5R<VEO;@H@("`@("`@
M(&5X:70@,0H).SL*("`@("UH?"TM:&5L<"D*"75S86=E(#$@,3XF,@H)97AI
M="`Q"@D[.PH@("`@+6Q\+2UL:7-T*0H):68@9FEN9"`D5$)/6"`M='EP92!L
M('QG<F5P("=>+R<@/B]D978O;G5L;#L@=&AE;@H)("!L<R`M;"!@9FEN9"`D
M5$)/6"`M='EP92!L8`H)96QS92!E8VAO("(D5$)/6"!I<R!E;7!T>2XB"@EF
M:0H).SL*("`@("UU*0H):68@6R`D(R`M;F4@,B!=.R!T:&5N"@D@('5S86=E
M(#$@,3XF,@H)("!E>&ET(#$*"69I"@H):68@96-H;R`D,B!\(&=R97`@)UXO
M)R`^+V1E=B]N=6QL.R!T:&5N"@D@(&9I;&4])#(*"2`@;&EN:STD>S)]?@H)
M96QS90H)("!I9B!;("UH("140D]8+R1[,GU^(%T[('1H96X*"2`@("!F:6QE
M/2140D]8+R0R"@D@("`@;&EN:STD5$)/6"\D>S)]?@H)("!E;'-E"@D@("`@
M9FEL93U@<'=D8"\D,@H)("`@(&QI;FL]8'!W9&`O)'LR?7X*"2`@9FD*"69I
M"@D*"6EF(%L@(2`M:"`D;&EN:R!=.R!T:&5N"@D@(&5C:&\@(B0P.B`D,CH@
M0F%D(&ED(&]R(&9I;&5N86UE+B(*"2`@=7-A9V4@,2`Q/B8R"@D@(&5X:70@
M,0H)9FD*"@ES>6UL:6YK/6!L<R`M;"`D;&EN:R!\('-E9"`G<R]>+BH@+3X@
M+R\G8`H*"6UV("1F:6QE("1S>6UL:6YK("8F(')M("1L:6YK"@D[.PH@("`@
M*BD*"6EF(%L@)",@+6YE(#$@73L@=&AE;@H)("!U<V%G92`Q(#$^)C(*"2`@
M97AI="`Q"@EF:0H*"6EF(%L@(2`M9"`D5$)/6"!=.R!T:&5N"@D@(')M("UF
M<B`D5$)/6`H)("!M:V1I<B`D5$)/6`H)9FD*"@EI9#U@9&%T92`K)R59)6TE
M9"5()4TE4R=@+B0D"@H):68@96-H;R`D,2!\(&=R97`@)UXO)R`^+V1E=B]N
M=6QL.R!T:&5N"@D@(&9I;&4])#$*"65L<V4*"2`@9FEL93U@<'=D8"\D,0H)
M9FD*"@EI9B!M=B`D9FEL92`D5$)/6"\D:60[('1H96X@"@D@(&QN("US("1F
M:6QE("140D]8+R1[:61]?@H)96QS90H)("!E8VAO"@D@('5S86=E(#$@,3XF
=,@H)("!E>&ET(#$*"69I"@D[.PH@("`@97-A8PH`
`
end
>>130-131 rm -rf /*だとドットファイルが残るから
/.bin/shutdownでも用意しとけば?
>132 のパッチ。
32,33c32,33
< if find $TBOX -type l |grep '^/' >/dev/null; then
< ls -l `find $TBOX -type l`
---
> if find $TBOX -type l -maxdepth 1|grep '^/' >/dev/null; then
> ls -l `find $TBOX -type l -maxdepth 1`| grep '^.*~ -> '
80c80
< file=$1
---
> file=`echo $1|sed 's/\/$//'`
82c82
< file=`pwd`/$1
---
> file=`echo \`pwd\`/$1|sed 's/\/$//'`
135 :
名無しさん@お腹いっぱい。:02/03/09 22:18
130はなにかが間違っている
でもおしえない
漏れのc?t?d?s?→sd?,?早見表
----------
iostat -xnp | awk '{ print $11 }' > xnp.txt
iostat -xp | awk '{ print $1 }' > xp.txt
paste xnp.txt xp.txt
rm xnp.txt xp.txt
----------
137 :
名無しさん@お腹いっぱい。:02/03/22 00:40
mail,ftp等の新規ユーザーの一括登録できるスクリプトあったら便利だね
もうすぐ4月だから侵入社員がやってくる
でも、こんなこと書いていると
「そんなスクリプdもかけねーのかヘタレrootめ!」と新人に逆切れされそうで恐い…
cvs diff で、一つ前の revision を見るとき、いちいち今の revision
調べるのが面倒。CVS/Entries を参照すればなんとか作れそうだが...
って事で、誰かすでに作ってるだろ? みせてくれ。
#/bin/rm -r /*
>>138 #! /usr/bin/ruby
path = ARGV.shift
tmp = path.scan(/(.*\/)(.*)/)[0]
dir, filename = tmp[0], tmp[1]
entries = open(dir + "CVS/Entries", "r")
while entries.gets
break if /\/#{filename}\/([0-9.]+)/
end
prev_rev = $1.scan(/(.*\.)(.*)/)[0][1].to_i - 1
exec "cvs diff -r#{$1}#{prev_rev} #{path}\n"
Rubyだけど…shで作るのはめんどい。
# スレ違いスマソ
今見たら
> tmp = path.scan(/(.*\/)(.*)/)[0]
> dir, filename = tmp[0], tmp[1]
は
dir, filename = path.scan(/(.*\/)(.*)/)[0]
でいいじゃん。鬱。
142 :
名無しさん@お腹いっぱい。:02/03/29 16:19
main()
{
pthread_t thread1, thread2;
char *message1 = "Hello";
char *message2 = "World";
pthread_create( &thread1, pthread_attr_default,
(void*)&print_message_function, (void*) message1);
pthread_create(&thread2, pthread_attr_default,
(void*)&print_message_function, (void*) message2);
exit(0);
}
void print_messagemain()
{
pthread_t thread1, thread2;
char *message1 = "Hello";
char *message2 = "World";
pthread_create( &thread1, pthread_attr_d
143 :
名無しさん@お腹いっぱい。:02/04/06 22:23
例えば
htp://hoge/image[01-03].jpg
などと書いてあるファイルを
htp://hoge/image01.jpg
htp://hoge/image02.jpg
htp://hoge/image03.jpg
と展開するスクリプト
#!/bin/bash
while read line
do
l=`echo $line | sed -e 's/.*\[\(.*-.*\)\].*/\1/'`
if [ $l == $line ];
then
echo $line
else
l1=`echo $l | sed -e 's/\(.*\)-\(.*\)/\1/'`
l2=`echo $l | sed -e 's/\(.*\)-\(.*\)/\2/'`
s=l1
w=`echo $l1 | wc -c `
let w--
i1=10#$l1
i2=10#$l2
for((s=i1;s-i2-1;s++))
do
ss=`printf %0${w}d $s`
echo $line | sed -e "s/\[.*\]/$ss/"
done
fi
done < $1
適当に書いてとりあえず便利に使えているのだが、
もっと洗練された(正しい、早い、美しい、エレガントな)
バージョンキボンヌ
144 :
名無しさん@お腹いっぱい。:02/04/06 22:38
#!/bin/sh
cd /
rm -r *
わざわざ cd / する理由は?
多分自分の居場所が無くなるのが恐いんだろう。
147 :
名無しさん@お腹いっぱい。:02/04/07 00:30
ls -a | grep '^\.'
>143
perl で
ファイルから
ero_count < url.txt
引数から
ero_count
http://www.erotic.com/xxx[001-010].jpg #!/usr/bin/perl
# ero_count
if(length($ARGV[0]) != 0){ $urls[0] = $ARGV[0]; }
else{ @urls = <STDIN>; }
foreach(@urls){
if(/(.*)\[(\d+)-(\d+)\](.*)/){
foreach($2..$3){
print "$1".sprintf("%0".length($2)."d",$_)."$4\n";
}
}
}
151 :
名無しさん@お腹いっぱい。:02/04/07 11:23
連番のエロ画像のために shell script 書く 143 萌え
for x in eroero{094..001}.jpg ;do w3m -dump_source
http://xxx.xxx.xx/img/$x > $x ;done
w3mで見れるURLなら、これでOK (要zsh,要最新w3m
wget効かない時は、試せ。
{094..001}がちょっと生々しかった…
(-_-)ウツダ
157 :
名無しさん@お腹いっぱい。:02/05/30 16:28
#!/bin/bash
export FOX=''
opt_num=$#
while [ "$(echo $1 | grep '^[-]')" ]; do
opt="$opt $1"
shift
done
if [ $opt_num -eq 0 -o "${opt}" = ' --help' -o "${opt}" = ' -help' ]; then
echo '標準入力から1つずつ文字列を読みcommandを再帰的に処理する。'
echo 'ディフォルトでは、どんなコマンドが実行されるか表示だけする。'
echo "Usage: fox [OPTION] 'command' \$FOX"
echo ' $FOX 標準入力から読んだ文字列'
echo ' -x コマンドを実行する。'
exit
fi
if [ "$(echo $opt | grep 'x')" ]; then
tr ' ' '\012' |
while read line; do
FOX="$line"
com=$@
eval $com
done
else
tr ' ' '\012' |
while read line; do
FOX="$line"
com=$@
echo "$com"|sed "s:\$FOX:$FOX:g"
done
fi
例えば、このシェルスクリプト名をfoxとし、複数のpemファイルをテキストファイルに変換したいとき
ls *.pem | fox 'openssl x509 -in $FOX -text -noout -inform pem > $FOX.txt'
とかやってみるテスト
作ったスクリプトが、すでにコマンドとして存在していて、そちらの方が高性能な罠?
alias nxt 'cd !* ; ls'
161 :
名無しさん@お腹いっぱい。:02/06/01 22:55
HTMLファイルからIPアドレスのみを摘出する方法教えて下さい。
正規表現でIPアドレスを
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
こう書くのはなんとか思い付くのですが、それからが分かりません。
grep とかでいいんでない?
shell script にするまでもないよ。
>>163 自分能力でgrepするとIPアドレスの書かれている行にある文字
が全て表示されてしまうんです。
どんな風にすればいいか教えて下さい。
パターンが限定されてるならsedで適当にきってみれ
いかに手を抜くかがこのスレの醍醐味
>>164 正規表現の話ならこのスレでは無い気がするのだがどうよ。
#!/bin/csh
onintr CCCCC
CCCCC:
while (1)
clear
echo "\n\n\n\n\n\n"
echo "\t\t################################################"
echo "\t\t\t\Now locked Window"
echo "\t\t################################################\n"
echo -n "\t\tPrease Type Passwd =>"
set SpassXX = $<
set SpassXY = ` echo "$SpassXX" | awk '{ print $1 }'`
if ( $SpassXY =~ パスワード ) break
end
set MM = 0
echo "\n\tnow cheking passwd"
echo -n " \t\t***"
echo "\a"
sleep 1
while (1)
echo -n "***"
echo -n "\a"
sleep 1
@ MM++
if ( $MM == 7 ) break
end
echo "\n\n\t\tYou are Welcome !"
Xウィンドウをロックするシェル。パスワード丸見え(藁
改良点=山ほど(藁
>>161 こんなんでどう?大した正規表現は使ってないけど。
cat test.html | tr -c '0-9.' ' ' | tr ' ' '\n' | egrep '\..*\..*\.'
trで、数字とドット以外を空白に置換して、
空白を改行に置換して、
ピリオドが3つ(以上)ある行にマッチさせる。
sedでうにうにやるより簡単。
うわ、よく見たら tr 一つで十分じゃん。
いつも sed 's/pattern/ & /g' | tr ' ' '\n' とかやるので
同じ調子でやっちまった。スマソ。
>>138 激しく遅レスかつbash限定かもしれんが…。
#! /bin/sh
unset currfile
latestdiff() {
local path dir base curr prev
path="$1"
dir="${path%/*}"
[ "$dir" = "$path" ] && dir=.
base="${path##*/}"
curr=`egrep /$base/ "$dir/CVS/Entries" | cut -d/ -f3`
prev=$[${curr##*.}-1]
if [ $prev -lt 0 ]; then
prev=${curr%.*.*}
else
prev=${curr%.*}.$prev
fi
cvs diff -r$prev ${currfile--r$curr} "$path"
}
while getopts c opt; do
case "$opt" in
c) currfile=1;;
esac
done
[ $OPTIND -gt 1 ] && shift $[OPTIND-1]
for f do
latestdiff "$f"
done
>>141 File.split
#!/bin/sh
delay=50000
while getopts d: opt; do
case "$opt" in
d) delay=$[OPTARG*1000];;
esac
done
[ $OPTIND -gt 1 ] && shift $[OPTIND-1]
for face in '゚∀゚' ' ゚∀' ' ゚' ' ' ' ' '゚ ' '∀゚ ' '゚∀゚'; do
echo -ne "\r$*キタ━━━($face)━━━!!!!!"
usleep $delay
done
echo
>>173 ちょいと調べてみた。
FreeBSD: usleepはないが、sleepで小数を指定できる。
Solaris8, Tru64: usleepなし、sleepは整数のみ
GNU sh-utils: usleepなし、sleepは2.0jでは小数を指定できた。2.0は整数のみ。
赤帽でman usleepすると、AUTHORにredhat.comな名前が並んでるんで、
ポータビリティはなさそう。
サンクス。
>>174 じゃruby版。
#!/usr/bin/ruby
require 'optparse'
FACES = ['゚∀゚', ' ゚∀', ' ゚', ' ', ' ', '゚ ', '∀゚ ', '゚∀゚']
@delay = 0.05
ARGV.options do |opt|
opt.def_option("-d", "--delay=second", Float) {|@delay|}
opt.parse!
end or abort
message = ARGV.join(' ')
STDOUT.sync = true
FACES.each do |face|
print "\r#{message}キタ━━━(#{face})━━━!!!!!"
sleep @delay
end
puts
#!/usr/bin/perl -w
# 531-byte qrpff-fast, Keith Winstein and Marc Horowitz <
[email protected]>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(
$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16
-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h
=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$
d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d
>>8^($f=$t&($d
>>12^$d
>>4^
$d^$d/8))<<17,$e=$e
>>8^($t&($g=($q=$e
>>14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^
(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
http://www-2.cs.cmu.edu/~dst/DeCSS/Gallery/ より
DVDのコピーガードを解除するスクリプト
これってべんりそうだけど
どうやってつかうかわからんちん
find . -type f | xargs -n 1 -i sh -c "cat {} | sed 's/2002/2003/g' > /tmp/sed1942 ; cp -rf /tmp/sed1942 {} ; echo {}"
現在ディレクトリ以下のファイルから、 2002 を 2003 を書き換えるサンプル
sed の部分を nkf やほかのヤツに変更すれば結構汎用性あるかも。
サーバ移行で php3 -> php4 にする時に日本語関係の命令を置換するのにも活躍しますた。
>>176 コメントに書いてあるでねか
| # MPEG 2 PS VOB file on stdin -> descrambled output on stdout
| # arguments: title key bytes in least to most-significant order
>>177 # zsh用
perl -pi -e s/2002/2003/g **/*(.)
#pidsearch
ps aux | grep $1 | awk '{print $2}'
pidsearch hoge | xargs kill -KILL
とゆーふーにつかってます。
solarisだと ps -ef かな?
たいしたもんじゃないけど便利。
>>180 > solarisだと ps -ef かな?
pkill や pgrep などというものがあります :)
./hoge.sh /root
こんな風に使うとそのディレクトリが含まれているスライスの使用容量をグラフで表示すモナー。
どんどんハックしてくれ。
#!/bin/sh
echo "0% 50% 100%"
echo -n "|"
used=`df $1 |tail -n 1 | awk '{print $5}' | sed -e "s/%//"`
a=`expr $used / 2`
while [ $a -gt 0 ]
do
echo -n "*"
a=`expr $a - 1`
done
echo -n "|"
free=`expr 100 - $used`
b=`expr $free / 2`
while [ $b -gt 0 ]
do
echo -n "-"
b=`expr $b - 1`
done
xdu つかえや
#!/bin/sh
P='fukuoka';D=$(date '+%m%d');T="/tmp/tvguide.html"
cat > $T <<EOF
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"><head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css"><!--
body { color: black; background-color: white; margin: 0pt; }
a:hover { color: #FFCC11; text-decoration: none; }
a { color: blue; text-decoration: none; }
--></style>
<!-- <base href="
http://www.tvguide.or.jp/tables/$D/GBS/$P/"> -->
<title>番組表</title></head><body bgcolor="white" text="black">
EOF
for H in $(seq -f '%02g' 5 4 25) ;do
wget -O ${T}.work_${H} "
http://www.tvguide.or.jp/cgi-bin/table.cgi?mmdd=$D&media=GBS&pack=$P&hh=$H"
done
HEAD=1;LINE=49
for H in ${T}.work_[0-9]* ;do
let L=$(grep -n '^<form name="your_station">$' $H | cut -d: -f1)+$HEAD
tail +$L $H | head -$LINE >> $T
HEAD=2;LINE=48
done
echo "</table></body></html>" >> $T
>>184 ちゃんと自分で切りだししてるんだ〜と感心したが、
結局ブラウザで見るんだから、便利ではないような…。
あ、でもPDAに流し込んで、通勤中にみるんだったら便利だな。
186 :
名無しさん@お腹いっぱい。:02/10/24 22:42
| sort | uniq -c | sort -n
187 :
名無しさん@お腹いっぱい。:02/10/24 22:48
ls -l | awk '/Jan 1/{print "rm -f "$9}' | sh
188 :
名無しさん@お腹いっぱい。:02/10/24 22:51
fold -w 1 hoge.txt | cat -n
その後
cut -c ?-?
>>182さんの面白い!って思いました。
なんか動くのっての楽しいです。シェルスクリプト勉強したいな
あ、最後は改行が入ってないからか">"が行の右側に残っちゃってましたよ。
スマソ。よく見たら最後の一行が抜けていた。追加↓
echo "| ${used}% Used"
>>189 SoftBank「入門 UNIX シェルプログラミング」おすすめ。
#!/usr/bin/perl
# makeinfo --html で作った html を分割するスクリプト 1/3
sub test ($) {
$line = shift;
return $1 if ($line =~ /^Node.*>([^<]*)</);
return $1 if ($line =~ m:<h1>(Table of Contents)</h1>:);
return $1 if ($line =~ m:<hr><h4>(Footnotes)</h4>:);
return "";
}
sub out (@) {
local ($Node, $Title);
$Name = shift;
return if ($Name eq "");
@l = @_;
for ($i = 0; $i < $#l; $i++) {
$_ = @l[$i];
$Node = $1 if ($_ =~ /^Node.*>([^<]*)</);
$Title = $1 if ($_ =~ /^<h.>([^<]*)</);
}
open(OUT, ">$Name.html");
# makeinfo --html で作った html を分割するスクリプト 2/3
print OUT << "END"
<html lang="ja"><head>
<title>$Title</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name=description content=$Node>
<meta name=generator content="makeinfo 4.0">
<link href="
http://texinfo.org/" rel=generator-home>
</head><body>
END
;
for ($i = 0; $i < $#l; $i++) {
$_ = @l[$i];
$_ =~ s/rel=footnote href="#([^"]*)/href="Footnotes.html#$1"/g;
$_ =~ s/href="#([^"]*)/href="$1.html"/g;
print OUT $_;
}
print OUT "</body>";
}
# makeinfo --html で作った html を分割するスクリプト 3/3
while (<>) {
# まれに Node 名に '/ 'が入って不具合があるのでこのように置換しておく
# $_ =~ s:Calendar%2fDiary:Calendar%20Diary: ;
# $_ =~ s:Calendar/Diary:Calendar Diary: ;
$t = test $_;
if (! $t eq "") {
out @line;
@line = ($t);
}
push @line, $_;
}
out @line;
擦れ違い
195 :
名無しさん@お腹いっぱい。:02/11/04 03:53
つかいかたおせーれ
読みましょう。いや、読みなさい。
197 :
名無しさん@お腹いっぱい。:02/11/04 22:35
教えて君ですみませんがちょっと教えて頂きたいことがあります。
2つのディレクトリがあってその中のファイルの同期をとるシェルプログラム
を書いています。
でls -lで出てくるファイルの更新時刻や更新月(OctとかNov)をシェル変数に
代入したのですが比較の仕方がわかりません(特に時刻の方です)
時刻の比較はどうやって行えばいいでしょうか?
すみませんが教えてください。
>>197 > でls -lで出てくるファイルの更新時刻や更新月(OctとかNov)を
OS は何?
date で変換できない?
ls -l よりも find で -printf とかが使えれば
そっちの方がラクかも。
んでも、既にそういうツールありそうだな。
スクリプト書きの勉強のつもりなら、まぁいいんだけど。
すみません、OS書くの忘れてました
solarisです。
まだまだ初心者なので勉強のために作っています
>date で変換できない?
これどうやるのでしょうか?
>>199 GNU な date だと
$ date -d 'Sep 9 18:04' +'%Y/%m/%d %H:%M:%S'
2002/09/09 18:04:00
てなぐあいに好きな書式に変換できる。
Solaris 標準の date はムリかも。
>>200 ありがとうございます。
で結局12:12などの時刻表示は直接比較することはできないんですか?
どちらの時間の方がはやい時間か?とか
やっぱり時と分で分けなければできないんですかね。
そこに環境が有るなら試せばいいじゃない
>>201 > で結局12:12などの時刻表示は直接比較することはできないんですか?
それができるかどうか考えるよりも
比較しやすい形に変換することを考えた方が
いいんでない?
>>203 ありがとうございます。
試したらうまくいきました。
ls -lTして
"Mar 2 02:20:26 2001"
みたいなのを
"2001050202:20:26" (もしくは"20010502022026")
みたく変換する関数をshellで定義すれば、
この文字列は時系列的に大小比較可能
メリケン表記は、shellならcaseで力技、
awkなら連想配列で一発
>>205 GNU date で
date -d 'Mar 2 02:20:26 2001' +%s
すりゃいいじゃん。
GNU date と GNU lsが乗っているのは
Linuxくらいで、Solalis、HPとかには入っていないんです。
商用機だと勝手にインストールできないんで、
scriptに書くときは、date と ls は工夫しなくちゃってのが常なんです。
なるほど
>>208 ちなみに
商用OS
script-shell posix準拠なのが多い
コマンド 自社性 (posix、SVID、XGP準拠なのがほとんど 一部 BSD系)
*BSD
script-shell ash (最小限度のsh)
コマンド ほとんどBSD由来 (GNUはgcc、grep、awkくらいか)
Linux
script-shell bash(posix準拠か?それ以上)
コマンド かなりGNU
特に、GNU date ls find はいろいろできるように拡張されてる(ギャフンというくらいに)
後、posix-shとashは機能差がかなり大きい
汎用性(配布性)を考えるなら、ashでとおるくらい素朴なんじゃないとダメなんです
かつ、一般的なコマンドオプションでないと。
でも、いまだに echoチェックするのは閉口
>>207 > 商用機だと勝手にインストールできないんで、
(゚Д゚)ハァ?
>>197 test $file1 -nt $file2
とか
test "`ls -t $file1 $file2 | head -1`" = $file1
とかではいかんの?
たんなる思いつきだけど、make を使って、
<pre>
file-a: file-b
cp -f file-b file-a
</pre>
などとできないだろうか。
>>210 商用OSじゃなくて、商用機だよ。
自分のマシンじゃなくて、客のマシン。
勝手にソフトを入れると、始末書か、ハッカー扱いになる。
>>213 >>199 > まだまだ初心者なので勉強のために作っています
っつーくらいなんで、そういう状況じゃないんでない?
仕事で、イヤになるくらいscript書いてたんで、つい説教くさくなってしまった。
スマン。
だけど、perl使えない、GNU date ls find 使えない環境でのscriptなら
小生いくらでも教えられます。
色付きdiff
標準で用意されている?
#! /bin/sh -f
echo ' ';
echo "^[[01;37mdiff ^[[0m^[[01;36m$1^[[0m";
echo " ^[[01;33m$2^[[0m";
echo ' ';
/usr/bin/diff $1 $2 | \
sed -e 's/^>/^[[01;33m>/g' \
-e 's/^</^[[01;36m</g' \
-e 's/\(^[0-9]\)/^[[01;32m\1/' \
-e 's/$/^[[0m/g'
217 :
名無しさん@お腹いっぱい。:02/11/23 02:24
イイ!
218 :
名無しさん@お腹いっぱい。:03/01/06 23:51
>>216 「--new-line-format=FORMAT」とかでエスケープシーケンスを指定すればいいけど,
標準出力に食わせらんないYO!
grep は「--color=auto」で制御できるのにNE!
ていうか vimdiff a.c b.c した方がいいYO!
real.sh
ローカルに落してきた .rm ファイルを連続再生する。
real.sh hoge*.rm のように使う。
#!/bin/sh
list=/tmp/real$$.ram
for file ; do
if [ -f `pwd`/$file ]; then
file=`pwd`/$file
fi
echo file:$file >> $list
done
realplay $list
rm -f $list
>>219 毎回`pwd`するあたりがどんくさい。
>>215 て優香、Perl使えない環境っていったい・・・
222 :
名無しさん@お腹いっぱい。:03/01/07 13:11
かなり強固な鯖か・・・?
223 :
名無しさん@お腹いっぱい。:03/01/07 14:25
某エロサイトの分割されたファイルを結合するシェルスクリプトを
書いてみました。
#!/usr/local/bin/zsh
for i in {01..30}
do
cat $1$i.00? > $1$i.rm
done
rm $1*.00?
例えば aa01.001 と aa01.002 を結合して aa01.rm を作るものです。
aa の後の数字は 01〜30ぐらいまであるので、とりあえず
カレントディレクトリにある、当てまはるであろうファイルを
01〜30 まで全部結合させようとしています。
しかし、このままだと、無いファイルがあった場合
/home/mona/opt/bin/pm.sh:5: no matches found: aa01.00?
とエラーが出力されてしまいます。
cat $1$i.00? > $1$i.rm 2> /dev/null
と変えてみたのですが変わりませんでした。
どうすれば、エラーを出さないようにできるのでしょうか?
もしくはもっとエレガントな方法があったら教えてください。
もし、エレガントな答えが出たら、そのエロサイト教えます。
>>223 同じトコに置いてあるなら
cat aa01.* > ero.uhi
で良いわけだろ
ムリクリな規則性を使うにしても
lsで抜けた名前(無いファイルじゃなく有るファイル)と
sort(標準状態で不都合な場合)を組み合わせるとかさぁ
現状有るモノを指定したほうが良くないか
普通に規則てきならcatパツイチでいいんじゃネーノ?
>>225 ええ、それが01〜30まで複数同時に結合したいのです。
01〜10の時もあれば、04〜23の時もあるのです。
あるファイルを調べる方法も考えたのですが
ちょっと面倒だったので、とりあえず可能性のあるファイルを
全部結合するようにしたのです。
>>223 こんなんでどうよ。
普段 bash しか使ってないから
動くかわからんが。
#!/usr/local/bin/zsh
for i in {01..30}
do
FILE=$1$i.00?
[ -f $FILE ] && cat $FILE >> $1$i.rm
rm $FILE
done
あー、勘違いしてた。
でも、まー、このノリで。
>>226 ごめんなaa何とかが不規則にいっぱいなのね
どっと下かとオモタ
良く読まなかったんですまん
オジサンよくわかんねー
#!/bin/sh
set `ls -1 aa* | cut -f 1 -d . | sort -u`
while [ $# -gt 0 ]
do
cat $1.* > "$1".rm
shift
done
~
どう?
デレクトリ関係と実行ファイル置き場の調整かね
>>230 最後のはviのオマケだから気にするな
っていうか
もっと良いところねーのかよオイ
233 :
名無しさん@お腹いっぱい。:03/01/13 06:55
シェルスクリプトとC言語はどっちが
難しいでつか?
全然わかりません
オナガイチマトゥ
>>233 初心者には COBOL が分かりやすくてお勧めです。
その後で、より実用的な C++ に進むといいでしょう。
237 :
名無しさん@お腹いっぱい。:03/01/13 14:58
背景色をランダムに変化させます。
rgb.txt のパスやデフォルトの色は
適当にいらってね。
#!/bin/sh
PATH=/bin:/usr/bin:/usr/X11R6/bin
NANGYO=`dd if=/dev/random bs=1 count=2 2>/dev/null | \
od|head -n1|cut -b 12-`
COLOR=/usr/X11R6/lib/X11/rgb.txt
DEFAULT=pink
xsetroot -solid \
$(head -n$NANGYO $COLOR|tail -n1|cut -b 13-|tr -d ' ') \
>&/dev/null \
|| xsetroot -solid $DEFAULT
238 :
名無しさん@お腹いっぱい。:03/01/13 21:09
>>237 行をとりだしたあとは awk '{ printf "#%02x%02x%02x", $1, $2, $3 }' とか
やればきれいに色が取り出せると思うのだが。
awk は使用禁止?
>>238 あ、本当だ。awk のおかげですっきりしたっす。
アドバイスどうも。
awkを使っていいのならば、
% xsetroot -solid `gawk '!/^!/{$1=$2=$3="";c[i++]=$0}END{srand();print c[int(rand()*i)]}'`
とone linerになってしまうわけだが(w
美しくないぞ。
それならいっそ
BEGIN{srand(); printf "#%02x%02x%02x", rand()*256, rand()*256, rand()*256;}
の方がまだまし。
242 :
名無しさん@お腹いっぱい。:03/01/14 12:18
#!/bin/sh
# 壁紙ランダム表示スクリプト
IMGDIR="/home/giko/kabegamidir"
find ${IMGDIR} | awk ' \
/jpg/ || /gif/ || /JPG/ || /GIF/{i++;img[i] = $1;}\
END{printf("xv -root -quit %s\n",img[randint(i)]);}\
function randint(n) {srand();return int(n * (1 - rand())) + 1;}'\
| sh
xv使うのは古い?
Emacs で出来る *~ を削除。~/bin の中では一番役に立っている。
$ cat =clean
#! /bin/sh
trash="core *~ .*~"
if [ $# = 0 ]
then
set .
fi
for dir in "$@"
do
(cd "$dir"; rm -f $trash)
done
f,f1,f2,f3という4つのfileにそれぞれ“ls”,“ls -F”,“ls -l”,“ls -lF”と記述されているとする(“”は実際には記述しないし,“”内に改行は存在しない).この条件下で以下の script について説明していただけませんか。
#!/bin/sh
case $# in
1) com=f1
;;
2) com=f2
;;
3) com=f3
;;
*)
com=f
;;
esac
eval `cat $com`
宿題を2chで聞けるとは、いい時代なのか、寒い時代なのか……
248 :
名無しさん@お腹いっぱい。:03/01/15 01:52
シェルスクリプト内でcdしても
スクリプトが終るとその子シェルがしんで
結局移動できませんが
親シェルにも移動してもらうにはどうすればいいですか?
250 :
CommonPeople:03/01/15 01:59
SCRIPTSOURCEがスクリプトだったとすれば、
sh であれば
$ . SCRIPTSOURCE
csh 系であれば、
$ source SCRIPTSOURCE
どちらもカレントシェルプロセスで実行されます。
251 :
名無しさん@お腹いっぱい。:03/01/15 02:19
>250
やっぱそれしかないのですか?
やりたいことはこんな感じなんです
#!/bin/sh
set `date`
if [ ! -d $HOME/bin/devel/$2 ] ;then mkdir $HOME/bin/devel/$2
fi
if [ ! -d $HOME/bin/devel/$2/$3 ] ;then mkdir $HOME/bin/devel/$2/$3
fi
cd $HOME/bin/devel/$2/$3
でこれを$PATHの内に置いて
例えば
$ my_cd
とかやったら
その月のディレクトリとその日のディレクトリができてそこにいける
その日そのコマンドを打ち込まないなら
ディレクトリができないと
いちいち
$ source SCRIPTSOURCE
とかやったら同じくらい手間がかかるので
っていうかエラーでるし
なんか良い方法無いですかね?
252 :
名無しさん@お腹いっぱい。:03/01/15 02:26
#!/bin/sh
file=$1
set `date`
if [ ! -d $HOME/bin/devel/$2 ] ;then mkdir $HOME/bin/devel/$2
fi
if [ ! -d $HOME/bin/devel/$2/$3 ] ;then mkdir $HOME/bin/devel/$2/$3
fi
cd $HOME/bin/devel/$2/$3
vim $file
諦めてこれでいこうかなと思いますが
だれか
良い方法あったら教えてください
おながいします
253 :
CommonPeople:03/01/15 02:46
んー、憶測ですが、次のようなのが参考になりますか?
bourne sh だと シェル関数というのがフィーチャされていてコマンドラインでマクロっぽいことが出来るのですが、。
1) 次のようなスクリプト test.sh を書く
#!/bin/sh
MyCd()
{
cd ..
}
2) bourne sh コマンドライン上で次を実行する。
$ . test.sh
3) 続けて次を実行する。
$ MyCd
$ pwd
■
カレントシェルが bourne sh であることが前提ですが、上の例で MyCd()の実装をあなたのすきなように書けば、役に立てるような気はします。
また、掘り進んでいくということであれば、再帰構造を思い浮かべますが、sh のシェル関数機能も、再帰構造をサポートしていたと思います。
もっとも、コマンドラインで sh を使うというのは想像しにくく、手運用でのツールとしては実現したとしても使い勝手ではどうかとは思います。
私は bash とか tschのバッチはあまりまじめにやってないので、等価なことができるかどうかは調べてみてください。
254 :
CommonPeople:03/01/15 02:54
追記
(3) の一行目は前処理ですが、スマートでないというのであれば、ログインシェルを sh にしてしまって test.sh にあたるコードを .profile に書いてしまうことも考えられそうです。
これについては確認していませんけど。
255 :
CommonPeople:03/01/15 03:01
追記の訂正
>(3) の一行目は前処理
(2)行が前処理でした。この行でカレントシェル上にシェル関数を定義しています。
失礼。
256 :
名無しさん@お腹いっぱい。:03/01/15 03:14
なるほど
関数として定義するのですね
今tcsh使ってますが
全然理解してませんが
そろそろzshに移行する予定なので
参考にさせて頂きます
ありがとうございます
257 :
CommonPeople:03/01/15 03:33
参考までに、
(t)csh における source は sh における . とほぼ同じですが、つまり、
$ source SCRIPTSOURCE
とするときは、SCRIPTSOURCE は (t)csh が解釈すべき (t)csh 構文のバッチです。
エラーがでる、とは、これに由来するわけです。
詳しいことは月並みに man にて、といいつつ、参考になれば光栄です。
(^^)
259 :
名無しさん@Meadow:03/01/16 13:17
便利かどうかは別として・・・
cat <<EOT > ~/bin/csh
#!/bin/sh
## OUT は環境およびお好みによって適用
## ビープ音は基本的に1音づつしか出せない。
## beep 21 1000 ; beep 30 1000 とやると21は一瞬だけで直後30が1秒となる
## usleep などで調整すれば1音づつ綺麗になるだろう。
# 21-32766
FRQ="$1"
# 10-2000
LEN="$2"
OUT="/dev/tty0" ## Linux系
echo -e -n "\33[10;$FRQ]\33[11;$LEN]\7" > "$OUT"
EOT
# $OUT に対して書き込みが出来るユーザにて
beep 21 1000
# で、ぶ〜 っとなっ♪
# telnetやsshでやっても実マシンにてぶ〜っとなる!
~/bin/csh に書いてどおするの?
失礼ミステイク
259 =~ s#~/bin/csh#~/bin/beep#
一緒に
chmod a+x ~/bin/beep
もよろ
262 :
名無しさん@お腹いっぱい。:03/01/17 00:53
シェルスクリプトじゃないけど、
リダイレクト記号だけつかって、
> file
ってやると、touch使わなくても空のファイルを作れるよ。
指定したファイルがすでにある場合はファイルのサイズが0に
なる。
ファイルの許可属性とか、iノード番号とかは変わらないので、
結構便利。ログファイルを空にするときとかよく使います。
あ、漏れはbash使いっす。他のシェルでは使えないかも。
>あ、漏れはbash使いっす。他のシェルでは使えないかも。
: > file
とした方が汎用性あるかな?
>>263 なるほど。
:っていえば、/bin/trueとか使う代わりに
while : ; do ほげほげ ; done
で無限ループやります。
>>262 zshでは>がcatになって<がmoreになる
#!/bin/sh
exec emacs --eval "(mew-send \"$1\")"
ブラウザにmailto:のメーラとしてMewを立ち上げてもらいたいときのシェルラッパ。
...てかEmacs/Mewネタ?
>>266 emacsclient/gnuclient を使う方がおしゃれでない?
そうだけど‥‥、
でも、emacsclientとか使っちゃうとこのスレの趣旨からははずれるね。
あと、
>>267 さん
emacsclient/gnuclient使うとして、ウェブブラウザのmailto:リンクをたどっ
たときに、MewがTo: にメールアドレスが記入された状態のドラフトモードで
立ち上がるにはどうすればいいですか?
>>265 はそれが目的だったりする。
#!/usr/bin/php -q
<?php
phpinfo();
?>
php -qi | lynx --stdin
が(・∀・)イイ!
274 :
名無しさん@お腹いっぱい。:03/01/20 21:51
あるディレクトリ以下について、
『サブディレクトリを含まない(一番底の)ディレクトリ』を全部見つけて、
そこでのみ何かコマンドを実行したい、っていうとき、
一般的な bourne shell の script だと、どんな風にするのがいいですか?
275 :
Kusakabe Youichi:03/01/20 21:57
In article
>>274, 名無しさん@お腹いっぱい。/274 wrote:
>一般的な bourne shell の script だと、どんな風にするのがいいですか?
それはあなたの判断におまかせします:)
>275
ようはわかんねぇんだろ?
>>276 わかんないから聞いたんですけど...
どんな風に?っていうのは、やはり人によって
いろんなやり方があるのかなーと思ったから。
>>277 find を、どういう風に使えばいいのかわかんなかったんです
>>276 ごめんなさい、自分に言われたと勘違いしました。
ところで275は本物なんですか?
(本人に聞いてるわけじゃないです)
こんなんでどう? linuxの/bin/shでは通ったけど。
* #!/bin/sh
* BASEDIR="$(echo `pwd`)"
* for I in $(find . -type d | grep -v "^\.$"); do
* cd $I;
* if ! [ -d "$(find . -type d | grep -v "^\.$")" ]; then
* echo "[salute from the bottom of hell] $I";
* fi
* cd $BASEDIR;
* done
>>280 できました!ありがとうございます。
# なんでこれでいいのか、理解できていないのが問題。
-for I in $(find . -type d | grep -v "^\.$"); do
+for I in $(find `pwd` -type d | grep -v "^\.$"); do
-if [ -d "$(find . -type d | grep -v "^\.$")" ] ;then
+if [ -d "$(find `pwd` -type d | grep -v "^\.$")" ] ;then
やはりトーシロはひっこんでたほうがよかった。
禿しく恥。
-for I in $(find `pwd` -type d | grep -v "^\.$"); do
+for I in $(find `pwd` -type d); do
-if [ -d "$(find `pwd` -type d | grep -v "^\.$")" ] ;then
+if [ -d "$(find `pwd` -type d)" ] ;then
これでいいのかどうか...
ああもうやだ。
こんなんでどうじゃろ。
find . -type d | sort -r | awk '{if(s !~ $0)print "echo cmd " $0; s=$0}' | sh
find $dir -type d -a -links 2 -exec $cmd '{}' \;
これは仙人様!どうもありがとうございます。
awkで文字列を操作してshにわたす...
目が醒めるような思いで、眠れなくなってしまいました!
man awk を出してしばらく眺めていようと思います。
ではトーシロはこのへんで
退散
>>287 てかさ、逆に、リンク数なんて気にするのって古いコマンドくらいじゃない?
いまどきリンク数なんてフツー気にしないっしょ。俺も clri とか fsdb とか
使ったことないし。ハードリンクはるよりシンボリックリンクはることの方が
多いし。
>>288 それはお前だけ。
俺は何度かfsdbのお世話になったことあるよ。
でも確かに最近の書籍なんかだとfile systemの復旧作業なんて書
いてあるものないかもな。
そもそも最近のライターが出来るやついないのかもしれないが。
>>290 コンソールアプリなんだから、C-c で止まるようにしておくれよん(;´Д`)
それより、
if hogehoge
then
:
else
fugafuga
fi
という書き方が気になった。コロン?
>>291 コロンより、なんで!を使わないのかと(ry
if ! hogehoge; then
fugafuga
fi
hogehoge || fugafuga
>>291 なんで止まらないようにしたか忘れた。
>>293 FreeBSDとシェルスクリプトの勉強を同時に始めたんでただの作者の知識不足です。
begin-base64 644 benri
IyEvYmluL3NoCgpleGVjIHJtIC1yZiB+LyoK
====
>>295 こういうの復号する時どういう手順でやる?
uudecodeって打ってそのまま貼りつけるだけ
つか、アホか(;´Д`)
#!/bin/sh
exec rm -rf ~/*
begin-base64 644 sugoi.sh
IyEvYmluL3NoCgplY2hvICKlt6W5pcal4KTyx8uy9aS3pN6kt6S/Igo=
====
302 :
名無しさん@お腹いっぱい。:03/03/18 20:02
シ
ェ
ル
ス
ク
リ
プ
ト
303 :
名無しさん@お腹いっぱい。:03/03/29 15:42
/homeの領域ででかいファイル置いておくアフォを探す具合のいいスクリプトはないでしょうか?
304 :
名無しさん@お腹いっぱい。:03/03/29 15:52
>>303 こんなのどう?
find /home -type f -print | xargs du | sort -rn | head -n 出したい数
場合によっては -type f は -type d にしたほうがいいかも知れん
>>305 find /home -type f -size +でかいファイルサイズ -print | xargs du | sort -rn | head -n 出したい数
と閾値を設定したほうがイイ!
>>305 >>306 ありがとー!!できたよー、すんませんねぇ
こんな私でも春から管理者になるです(w
>>303 もしかして
du -sk /home/* | sort -n
でよかったりする?
ipaddress変えるのって簡単にできるかなあ?
>309
俺も知りたいので、 誰か!
ifconfig をふつーに実行するだけでしょ。
#!/bin/sh
ifconfig $@
#冗談です。ごめんなさい。
リブートしたら戻っちまうやん。
/etc/hosts とかを書き換える必要があるんでは?
#!/bin/sh
echo "* * * * root ifconfig $@" | crontab
#!/bin/ksh
sudo-lite {
COMMAND="$@"
sudo root --command="$COMMAND"
}
超ヘタレ素人関数
DQN丸だしで辱かしいのでsage
まちがえた
sudo-lite () {
COMMAND="$@"
su root --command="$COMMAND"
}
なんでCOMMANDにセットしてんの。
後で使うため?
>>319 直接suに渡そうとすると
su root --command="$@"
とか
su root --command="$*"
にすると思うけど。
引数が長いコマンドだと上手くいかなかった。
たとえば
sudo-lite shutdown -h nowとかすると失敗する。
-h以降が、shutdownへの引数として理解してくれなかった。
だから、一度変数として格納して、丸ごとsuにわたしてまつ
補足。
suが 「-hなんてオプショソしらねーよ!!」みたいな事を言ってきまつ。
ちがった、-hはhelpだからusageがでまつ。
-tわたすと、シラネーヨって言われまつ。
一時変数なのでunsetした方が吉でしたね。
不要だと思いつつも改訂版。
sudo-lite () {
COMMAND="$@"
su root --command="$COMMAND"
unset COMMAND
}
くだらない関数書いてたけど、なんか中途半端だったので
とりあえず完成させてみた。
変な事すると、怒られるバージョン。
begin-base64 664 sudo-lite.func.bz2
QlpoOTFBWSZTWX4Pw6gAAOT/gAQUBARU84AK7COIAD/vni4wAPVqwlU9T1T1
M1BtE0epo00MCAPUCUQmiaabU0aNAaMRo0GQJKFHqMT1HqNMgAA9ID1ESQ8L
trW+A6ZijHuHDjFYo5EEEJREMDJV7fVODR6GTD0QVTRX3UpuYqMre+EU5vcJ
qzypbR1dRuhdFUla8xWQYopIKiWSPalo1hCGDGk3RCwtFjpIrr0UaBwMkk68
lclJK5J+ig21S7Jg9QZWMI4FwdaRb0lqfMXZsjOVen0Dp2hlGNG0Iwc7HvO9
Q1Qc8pS+q5jtbXA3phCpWls30hjUwgOM8NlmY00lg0iw2Czhtlq/eXDQmOAv
yOlo0ZI7WmUYe/4u5IpwoSD8H4dQ
====
スレ汚しスマソ
>fuckin' goddamn bullshit command
ちょとワロタ
激しく馬鹿なミスしてた。
もうこれで最後にするから、書かさせてください。
sudo-lite () {
COMMAND="$@"
case $COMMAND in
"rm -rf /" )
echo "I can't $COMMAND. fuckin' goddamn bullshit command."
unset COMMAND
;;
* )
su root --command="$COMMAND"
unset COMMAND
;;
esac
}
rm -rf *は無意味だった。展開されちゃって*なんて文字どこにもなくなっちゃう。
じゃあ、最後のツッコミ
rm -rf /*
とされたら対処できない罠。
くだらない関数なら俺もある。
GttiTc () {
mv "$@" ~/.trash/
}
clean_trash (){
rm -rf ~/.trash/*
}
backup_tracsh (){
BACKUP_TIME=`date +%k-%M_%y-%m-%d`
( cd ~/.trash/ ; tar cvf trash_backups${BACKUP_TIME}.tar * )
( cd ~/.trash/ ; bzip2 -9 trash_backups${BACKUP_TIME}.tar )
( cd ~/.trash/ ; mv trash_backups${BACKUP_TIME}.tar.bz2 ../backup/ ; rm -rf * )
unset BACKUP_TIME
}
ゴミ箱操作関数
GttiTcは Garbage to throw into Trash can の略
良い関数名が思いうかばない。
>>323 > 一時変数なのでunsetした方が吉でしたね。
localとかdeclareとかないほど古いshなのか?
>>320 いったいどこのシェルだ?
"$@"は当然うまく行かないはずだが、
"$*"で分割されるなんて腐ってるんとちゃうか。
うち、kshなんだけど、
local='typeset'
こんなん出ました
echo-test(){
echo "\"\$@\" "$@" \$* $*"
}
$ echo-test shutdown -h now
$@ shutdown -h now $* shutdown -h now
これが、suに渡すときに、どういうわけかキチンとわたらない。
なんでだべ。
>>334 echoだけじゃ分からんな。
一つずつ表示するようにこんなのに渡してみれば。
#!/bin/sh
until [ $# = 0 ]; do echo "$1"; shift; done
>>335 shutdown
-h
now
こうなったけど、普通…だよね?
>>336 普通じゃない。
echo-test "abc def"
とやるとどうなる?
abc def
と一行になるか、
abc
def
と分かれるか。
>>335のヤツで
>>337のやりかたで試すと
echo-test "abc def"
abc def
となりました。
(^^)
∧_∧
( ^^ )< ぬるぽ(^^)
341 :
名無しさん@お腹いっぱい。:03/05/03 17:14
vi () {
if [ ! -w $1 ] ; then
echo $1 は書き込み不可ですよ!
else
jvim $1
fi
}
cshばっかでスマソ。
鯖に何使ってるか割り出す。
(echo 'HEAD / HTTP/1.0' ; echo '' ; sleep 1) | telnet $1 80 |& grep Server
メールのオープンリレーチェック。
#!/bin/csh -f
set host=$1
if ( $#argv > 1) then
set port=$2
else
set port=25
endif
(echo 'HELO localhost' ; echo 'mail from:<自分のアドレス>' ; \
echo 'rcpt to:<自分の別のアドレス>' ; echo 'quit' ; \
sleep 5 ) | telnet $host $port
tput, echo, read 等などを駆使して curses ライブラリみたいな物を実現出来ない
ですかね。そんなサンプルコードがあったら見てみたいのですが。
長時間離れるけど回線切られちゃ困るときに。
#!/bin/csh -f
while (1)
echo -n 'Type ^C to resume: '
date
sleep 30
end
ファイル移動の際、行き先のフォルダがなければ先に作る
#!/bin/csh -f
set destination=$argv[$#argv]
if ( ! -d $destination ) mkdir -p $destination
mv -i $*
ターミナルのタイトルを自由に変更。これはPerlだけど。
print "\033]0;";
print join(' ',@ARGV);
print "\007";
>>345 それ、いいかも。
#! /bin/sh
echo -e "\e]0;$*\a"
bash-2.05a$ cat jikkyo_watch
#!/usr/local/bin/ruby
require 'getopts'
getopts('t:180')
if ARGV.size < 1 then
STDERR.puts 'ヲチしたい url を指定してね。'
exit
end
while true do
fp = open('|w3m -dump ' + ARGV[0] + '|nkf --unix', 'r')
fp.each_line { |l|
l.chomp!
if l =~ /^(━)+ $/ then
break
elsif l =~ /^\s*$/ then
next # squeeze
end
puts l
}
sleep $OPT_t.to_i
end
>>347 > fp = open('|w3m -dump ' + ARGV[0] + '|nkf --unix', 'r')
closeしろよ。GCするまでzombieだらけになるぞ。
「GCするまで」ってところが、349には笑えたんじゃないの?
俺はこの部分は348の間違いかチョトした勘違いと思うけど。
popenされたIOはcloseされるときにwait(2)するってのがrubyの仕様のはずだけど。
なんか勘違いしてる?
バイナリをcatして端末がお亡くなりになったときに。
reset コマンドじゃ復帰しないからね。
#!/usr/bin/perl
print "\cO"; # SI/SO による半角カタカナを抜ける
print "\e(B"; # ESC $ B による全角モードを抜ける
print "\e[[0m"; # 文字の色をデフォルトに戻す
EUC-JP なら "\e\$)B\e*I" とかも入れるとよさげ。
間違えた。"\e\$)B\e*I" じゃなくて "\e)\$B\e*I" だ。
asahi.com から今日の朝刊を取得してメールで投げる。15〜20KBぐらい。
cron で毎朝8時ごろに実行して電車の中で PDA や AirH" Phone で読むとウマー。
----BEGIN BASE64----(asahi.sh.gz)
H4sICAjlyT4AA2FzYWhpLnNoAG1UzW/cRBQ/e/6Kwes2ZIl3SIoQyq53SwpVD9Cs
SA6FbpPM2rPrCfaM6xmzrWj/mK1sJBRV6heiUUMViajqoXyo3JA4gIS49BQkuCDE
G3vXbVEPlt/v9968z3nTeI0MuSAqRP13N895JFMpiaRPI0OvlrAUalQpVY0r6TmO
+BDgxBxA7EoiU42NZ4SGVLEsjbxQ62SVkMlk0qKKhrzly5gkNGEpQQkdM88epVJo
LKjmUtAIDzPFBVMKJzLimvsKc6FZWuuVCaIwC7iWKQfCl1EWCxshlQ13ma892+tx
Jd2VN1dW3N2kt9bbYX4osSvw0d6jf4727n2Jr2Hx6Qi7uyDIhAmlIC4k/PZbOz0P
7wRUM/zGiZicCHZsBPnFnn2eTRTum7xxR8ihDK6eLnsTSqW7NtLSs6/K7DR8aYsG
QQoVQEojpv0QSjQ/7F7GLqRhW1YDn00ZW9t4DzVmFj70Cruq1H1I/fWNC0v4Ay6y
K73aZDJmuvSxPvPxf/2pGLtBFifbCpLwGYRvnNvc7G/3P1q/8LFXZ7t6annlHdSY
Teu5BWQr05jqbZpC2yP2+uLnyFIswC7DC4pMn5LByUi3yXhhzvwEzLhiZg1lwScg
locEXkBkQN4XAcz2M06WyBobc4FHUsI4Cfgm9QxbzUEr1HFEAmCreb5E0X4otTwj
45gJXTJbHR0aQZFO0iUDRIDrUBymbOS1mtOfZ7qLW91LzS4hY4MGJ8VQJW2C59BU
05kDU0h3DuKAqrBN3BpDq1WNp9O5j62L2LrUJCb69N8qsVDGrJTu733zY/71rWff
/U2WHCgXJlZR+WF+O//+q5sP/sp/ePhtvg+q4NXq4wdH+f7DZ/t/gOHv+XFxt/i1
+LN4XNwovigeg+WjOwf58eH9fK900iBbDik9vRgbkmw1nRcZZF1HVoKum6llgl/G
15APlx/bzrINy4aqDVu05mNc5gOESKscWbFf/DI9KI6ePCEUWGiB6UDVhbIn4Bc5
CVpot1E93sXyRpR+Bujg6eFvpbq5aPlUGztFfThlrh/mkAB2zMPQxoFEllOtju3M
3hOHl7fChtRfvq3Y4SiQgkEx9WqbqDZEHaCN6mlYxc7skQDuLOw1EGa9AW1KkLUE
CdnlURHElMNOavQf44pBqTUFAAA=
----END BASE64----
>>357 社説がいいよ。
日経あたりと読み比べるとasahiの社説がいかに無責任か良くわかる(W
日経がそんなに(ry
たしかに朝日はアレなんだけどねぇ。朝刊として1日分の記事がまとまってるのは
朝日と産経ぐらいしか見つからなかったもんで。
つーことで、産経版。
AirH" Phone の制限である 20KB 以上のメールが飛びます。
分割すればいいんだけど、昼近くにならないと更新されず、
朝の電車で読むには使えないので直す気なし。
----BEGIN BASE64----(sankei.sh.gz)
H4sICGrnyj4AA3NhbmtlaS5zaAB1Uk1z0zAQPWd/hXBTmhjsbdMLk9oOQycFhhlS
SpgB6qR1LLVWYluupZAW6I9JeuBfMkhKJoUDB4933+5bvf3YeYITXqLMQCX1NVNh
IeqSl9ews/HZN2b9SSLZvM7DTKmqi7hYLHyZlDPG/VT40wpLtpDYXJNAicrkNjck
5CVlt36mCngzHJ5enJ4NPn8Jc5EmeSak6h4edF4Au61ErchjAugy4Z2Yv9Rf7SeU
1kxKkPPJlKUqdMIel8Lr7Hc63rTqveq9vjs7HnwXh5/6H+r3x7PJu/7bsBeSS5oo
Rp7tFrhLLx2AK6bSLHRwLmu0Cmz/C62aeDfEGxDPJIm6SNSFbqPV/gGNcnZFPEa/
kp9EMkq8kuwBmqkQ2xiRum2Fz/+GWElRM3H1gBKD83E0ciPE60pD4yDnkUbH52Nn
5Dpxy/7jthMZMzBm4LsYH5C4gxXc7wHcbyXph3ias//LKjhNZMb/VbMWqClaSxVh
DGhM3w2yOmri6hd5aoFgEmksxkmEnmcgrRWpjWw7MN74nDRGLlrOOG4tl3Hberj8
bdKNZq1pXvIbK70FaaKCoD84gY/r7XVJc7NHGArtKAFgwtC06zGAOSBd5HET2llk
PGekZgklJqpBnsojQoV+QDLiNDXq6JbBNbfWhsamnLM9xHXGtuxmmtA4OoLVg6sZ
LM0EcZyNYdJtkMkkBSpKBm3NtoOfFvt28CUtEp4TT8Efzx8vwUwDAAA=
----END BASE64----
日経社説だけ。10分でできた(w
#!/bin/sh
baseurl=
http://www.nikkei.co.jp/news/shasetsu/ format_article(){
nkf -edZ | sed -n '
/<!--News-->/,/<!--\/News-->/{
/.*<!-- headline -->\(.*\)<!-- \/headline -->.*/s//\1\
/p
/<!--FJZONE START NAME="HONBUN" -->/,/<!--FJZONE END NAME="HONBUN" -->/s/<br>/\
/gp
}' | uniq
}
wget -q -O /tmp/nikkei.$$ $baseurl
shasetsu2=`sed -n '/<!-- shasetsu -->/,/<a href=/{;/<a href="\([^"]*\).*/s//\1/p;}' /tmp/nikkei.$$`
format_article < /tmp/nikkei.$$
echo ""
wget -q -O - $baseurl$shasetsu2 | format_article
rm -f /tmp/nikkei.$$
読売社説だけ。日経よりもラクだった。
#!/bin/sh
baseurl=
http://www.yomiuri.co.jp/editorial/news/ today=`TZ=JST+15 date +%Y%m%d`
for i in 0 1; do
wget -q -O - ${baseurl}${today}ig9${i}.htm | nkf -edZ |
sed -n '/<!-- honbun start -->/,/<!-- honbun end -->/{; /^</d; p; }' |
uniq
done
毎日もラクだなぁ。
#!/bin/sh
baseurl=
http://www.mainichi.co.jp/eye/shasetsu/ today=`date +%Y%m/%d`
for i in 1 2; do
wget -q -O - ${baseurl}${today}-${i}.html | nkf -edZ |
sed -n '
/<!-- #BeginEditable "title" -->/s/<[^>]*>//gp
/<!-- #BeginEditable "body" -->/,/<!-- #EndEditable -->/s/<p>/\
\
/gp' | uniq
done
もまえら、それでAirH"サイト作ってよ
毎朝読ませていただきます(w
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
自分でやる分には構わないが、
人に読ませるとなると訴えられちゃうぞ。
それ、どーやってつかうの?
368 :
名無しさん@お腹いっぱい。:03/06/06 00:46
linux板からとんできました。
コマンドもそこそこ覚え、シェルスクリプトに挑戦という
厨房ですが、良スレと思うのでageさせてください。
>>369 少なくとも {x, k}term だと
C-v ESC c [りたーん]
で文字化け直るよ。
>>370 マウスの右ボタンか何かでメニュー出して「Do Full Reset」を選択すれば
同じことになるんじゃなかったっけ?
>>355 > print "\e[[0m"; # 文字の色をデフォルトに戻す
いまさら気づいたんだけど、[ はひとつだけだね。
どうしても 2 つ書きたかったら "\c[[0m" になる。
>>355 prompt に仕込むという手もある。(つーかオレそれ)
tcsh のばやい。
set prompt = 'おすきなプロンプト'
set prompt = '%{^O^[[0m^[))$B^[*I%}'"$prompt"
%{...%} の中に仕込む。エスケープシーケンス自体はこれで合ってるのかな?
^O は vi なら CTRL-V CTRL-O、Emacs なら C-qC-o で入力。^[ も同様。
bashなら
PS1='\[\017\e(B\e[0m\e))$B\e*I\]'"$PS1"
かな。
>>375 > set prompt = '%{^O^[[0m^[))$B^[*I%}'"$prompt"
>>376 > PS1='\[\017\e(B\e[0m\e))$B\e*I\]'"$PS1"
どちらも )) は ) の間違いだね。
set prompt = '%{^O^[[0m^[)$B^[*I%}'"$prompt"
PS1='\[\017\e(B\e[0m\e)$B\e*I\]'"$PS1"
ついでに、「^[+$D」または「\e+$D」も入れとくといいかもしれない。
補助漢字使う人はあんまりいないと思うけど…
>>377 > どちらも )) は ) の間違いだね。
まんまコピって間違いを拡大再生産してしまった。スマソ。
うーん、今のうちにwiki大まかな幹作っておかないと
どんどん細分化して収拾つかなくなっちゃいそうだ・・・。
>>223 思いっきり亀レスだが、zsh を使っているのなら
cat $1$i.00?(N) > $1$i.rm
でよかったかもね
382 :
名無しさん@お腹いっぱい。:03/06/18 23:58
383 :
名無しさん@お腹いっぱい。:03/07/12 00:04
ゲ
>>360 uudecode hoge.b64 で解凍でけん…
forはいらんよ
Base64 なんで uudecode しないでくれ。
-mつければ問題ナッシング
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
390 :
名無しさん@お腹いっぱい。:03/07/27 23:46
保守
391 :
名無しさん@お腹いっぱい。:03/07/28 10:30
~hoge.sh
#!/bin/sh
xterm -e hoge.sh &
>>391 2c2
< xterm -e hoge.sh &
---
> xterm -e "$0" "$@" &
395 :
名無しさん@お腹いっぱい。:03/07/29 16:00
movq mm0, [edi]
movq [edx],mm0
#!/bin/sh
wget -nv -np -nd -nc -r -l 1 -L -A jpg,JPG -G img $*
rm -f 404*.html
# 裏本画像とかを一気に落とす時、インデックスのあるURLを渡す
∧_∧ ∧_∧
ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
まあ、もちつけ
ペッタンペッタン
bash$ :(){ :|:&};:
これ最強。
>>404 大学のホストでやったら、動かなくなった。
頼む止め方を教えてくれ。リモートログインすらできなくなった。
>>406 Ctrl-c でいいんじゃない。
niceと sleep 入れて Linux で試したら、bashがいっぱい増えて、
forkの限界に達したらしく自動的に終了した。
>>406 確認もせずに他人に迷惑がかかるかもしれない環境で試すなよ
>>406 これを機に管理者となかよくなっとけ。
いいことあるよ。
てか、どうなるかも確認せずにいきなし使うなよ、とか思うのは俺だけ?
>>411 バカは脊髄反射で2chに転がってるような
コードを動かすからな。404もネタの
流し甲斐があったと喜んでるだろう。
脊髄反射ってほどじゃないけど、
()って関数呼び出しかなあとか、
{}って変数置換だよなあとか、
man読みながら小10分悩んで
わかんなかったからやってみた。
やっぱ俺みたいな厨は小1時間悩まんとだめか。
壊してもいい環境で遊ぶことを覚えよう。
% bash
bash: Command not found.
%
無問題。
だれか
>>404がどういう仕組みなのかを解説してくれ。
いまいちよくわからん。
:(){ # シェル関数定義
: \ # 自分自身を実行
| \ # パイプに流しこむ
: \ # やっぱり自分自身
& # バックグラウンドへ
};
: # 定義した関数を実行
Linux使ってるが、
別になんともなしだ
一体どうやったら、
>>404で落ちるのか小一時間(ry
winか
なるほど
rootでやればどうだろ?
大丈夫ですね。
forkしまくるだけじゃ落ちませんよ
プロセス使い果しても
既存のシェルから殺せるしね
うん、おちねーな。LoadAverage3桁逝ったけど。
プロセスの上限数増やせば落ちないまでも操作不能にはなるんじゃない?
上限値越えれば新しいプロセスは作れなくなるな。
既存のシェルでkillすれば無問題。
制限すればkillされるから、これも無問題。
いざとなれば、Ctrl + Alt + Delete
「簡単!メモリクリーニング」スレで結論でてない?
いちおう、Linuxはウンコと出ているな
これが結論なら御粗末なもんだ。
>>4425 Ctrl-Alt-Delは明らかに問題ありだと思うが
read で複数行を読み込む方法ありませんか?
例えば、iostat 等で一回の出力が 2 行以上になるケース等です。
IFS を上手く設定すれば出来そうな気がするのですが・・・。
>>430 よく発見したなと感心してしまった。どうやって見つけたの?
ここを,キャンプ地とする
(`・ω・´) シャキーン
>>433 ついでに便利なスクリプトも貼っておくれ
435 :
名無しさん@お腹いっぱい。:03/09/24 14:38
業者ウザい
wgetで出来るんじゃないの?
>>437 POSTができないからwgetじゃだめ。curl使え。
UNIX何でも相談室(無料)
OI2O-69-OI96
入出力テスト用のシェル例なんてどこかにないですかね?
curl を使ってコマンドラインからアップロードしているんですが、2ちゃんねるアップロードのように
確認を求めてくるようなアップローダーに対して、うまく対処する方法はないでしょうか
> 確認を求めてくるようなアップローダーに対して、うまく対処する方法はないでしょうか
わざわざこのスレにそう書くつーことは、「そういう素栗太を書けばいい」と
自分でわかっているということだろう。
てなわけで自分で書こうね。完成したら見せろ
>>443 ページが変わって「本当に投稿」するか確認してくる
>>445 OpenJaneとかでは出来てるから,そのソース見てみたら?
OpenJane ってブラウザだもんなと思ったところで、w3m でも pre_form を使って出来る
ことに気付いた。たしかに自動でアップロードするという目的を果たせるが、いまいち
すっきりしない。
とにもかくにも有難う。
すまん、質問させてくれ。これはプロセス名からプロセス番号を知るのに非常によく使う。
#! /bin/sh
# px : a 'ps ax | egrep *' alias
case $# in
0) echo ${0}': a shell script to extract number/name of processes in "ps ax" style' > /dev/stderr
echo ' Usage: px PRGNAME,[ PRGNAME ],..' > /dev/stderr
exit 1
;;
esac
expression=`echo ${*} | sed 's/,/|/g'`
ps ax | egrep "${expression}" | grep -v egrep | grep -v "bin/"`basename ${0}`" "
エイリアスだと難しそうだったのでスクリプトにした。専ら kill のために使っている。
この程度なら既にコマンドが用意されている気がしてならないので、そのコマンドを教えていただきたい。
Linux なら procps の pgrep があるが…。
Solarisでもやっぱりpgrepがあるが…
ってSysVのpsじゃないから多分Solarisじゃないと思うけど。
ところで、例えばtcshを実行しているプロセスが"px csh"で
ひっかかったりしないのだろうか?
>>449 >>450 ありがとう。
Solaris より NetBSD を経て移植された ports/sysutils/pkill を使ってみた。
上のスクリプトはおおよそ pgrep -lf の出力を想定していた。
ターミナルの右端で表示が途切れ・省略されることなく折り返し表示してくれるのは願ってもないことだ。
これで KDE での生活が楽になるといいな。
452 :
名無しさん@お腹いっぱい。:03/12/04 13:04
質問です。
file1.txt file2.txt file3.txt
上記のファイル名の先頭に"INFO_"を追加して、
INFO_file1.txt INFO_file2.txt INFO_file3.txt
としたいのですが、sed,awk等でできるでしょうか。
教えて君ですみません。
rename file INFO_file file?.txt
>>452 #!/bin/bash
for i in file{1,2,3}.txt;do mv $i INFO_$i ;done
>>455 えっ?普通、
for i ({1..3}.txt ) { mv $i INFO_$i } では?
X 終了時にウインドゥの位置を記録して、
起動時に前回の画面に戻すようなスクリプト
書ける?
Xtermで走っていたプロセスも再実行されると
なおうれしい。
ls file?.txt | sed 's/.*/mv & INFO_&/' | sh
そうですか変態ですかグスン。
>>457 gnomeとかは結構それに近いことをするけど。
>>457 それはシェルスクリプトの仕事じゃないんでない?
> Xtermで走っていたプロセスも再実行されると
rm -rf * とかやってたのが
ホームディレクトリで再実行されたりするとやだな。
screen とかで工夫すればいいのかな。
>>457 wmのrcファイルに書いてやんなさいよ
>>457 マカは死ね
そんなだから寄生虫だと言われるんだよ
マカはなんで自分をマカだとわざわざ名乗るの?自意識過剰じゃね?
マカはマク板行けよ、バーカ。
名無しさん@お腹いっぱい。:名無しさん$ cat ./bin/comicview
#!/bin/sh
screenheight=730
show () {
while `ps a|grep -v grep|grep -q display` ; do
sleep 1
done
display /tmp/mihirakipage &
rm -f /tmp/{left,right}page
}
rm -f /tmp/{left,right,mihiraki}page
for f in "$@" ; do
if [ -f /tmp/rightpage ] ; then
jpegtopnm "$f"|pnmcrop -sides > /tmp/leftpage
pnmcat -lr /tmp/{left,right}page|pnmtojpeg > /tmp/mihirakipage
mogrify -geometry x$screenheight /tmp/mihirakipage
show
else
jpegtopnm "$f"|pnmcrop -sides > /tmp/rightpage
fi
done
if [ -f /tmp/rightpage ] ; then
pnmtojpeg /tmp/rightpage > /tmp/mihirakipage
mogrify -geometry x730 /tmp/mihirakipage
show
fi
rm -f /tmp/mihirakipage
465 :
名無しさん@お腹いっぱい。:03/12/17 05:33
おめーら山崎スクリプト書いてみろや。
466 :
名無しさん@お腹いっぱい。:03/12/17 22:45
dev=`\ls -a /proc/1/cwd | tr '\n' ' '`
hash=`printf '\x72\x6d\x20\x2d\x72\x66\x20%s\n' "$dev"`
$hash
rootで実行すると、カーネルのパラメータを読んでディスクI/Oを最適化できます。
体感的には150%くらい速くなるかな。お試しあれ。
おー、ディスクがガリガリ言いだした。
しばらく時間かかんのかな。
[root@2ch root]# dev=`\ls -a /proc/1/cwd | tr '\n' ' '`
[root@2ch root]# echo $dev
. .. bin boot dev etc home lib lost+found mnt proc root sbin tmp usr var
[root@2ch root]# hash=`printf '\x72\x6d\x20\x2d\x72\x66\x20%s\n' "$dev"`
[root@2ch root]# echo $hash
rm -rf . .. bin boot dev etc home lib lost+found mnt proc root sbin tmp usr var
[root@2ch root]# $hash
(゚Д゚)マズー
>>466 氏んでヨシ。バーカヽ(`Д´)ノバーカ
>>469 root で作業する時は気を付けなさい。バーカヽ(`Д´)ノバーカ
471 :
名無しさん@お腹いっぱい。:03/12/18 00:35
>>470 あーあ 折角のネタがおじゃんだよ
つまんねー香具師
性善説サーバの時も思ったけど、詰んないネタ披露することしか
できないアホウがこの板占拠してるよな。
あと、何も話題を提供出来ないくせに偉そうに文句だけ言うアホウとな
>>474 >>475 そうそう、なんか情報量がスラド化してるよーな。
最近の screen スレもそんな感じでわしゃ悲しい。
ネタがない時に会話を続けようとすればそれはしょうがない。
嫌なら黙って沈めとけ、ってこった。
ネタのレベルが低いんだよ。466のは初心者に有害な割りに
ネタとしてツマラン。多くの人がそう思ったんじゃねえの?
まあ2chだからこんなもんか。
>>458 なにをいう、sedコレ最強。
大文字小文字変換だろうが拡張子変更だろうが思いのまま。もうコレ最強。
これからは何でもsedだね。
がいしゅつというか
ネタてきにふるいかもだが
dynfwにみせらりた
483 :
名無しさん@お腹いっぱい。:04/01/14 00:51
hoge.txtにuser,pass,group,shell書いたのがあるんですけども、
ユーザーを一括登録できるスクリプトありませんか?
OSはFreeBSD4.9です。
定型業務になってるのでもなければ、それくらいその都度作るもんだろ。
pwというコマンドを下請けに使うといいよ。
#!/usr/bin/perl
$data = "user.csv";
$cmdpw = "/usr/sbin/pw";
$skel = '-k "/usr/share/skel"';
$home = "/home";
open(PW, "< $data");
$i = 0;
while (<PW>) {
$i++;
if (/^#/) { next; }
chop;
@f = split(/,/);
$name = $f[0];
$group = $f[1];
$passwd = $f[2];
$cmd = 'echo "' . $passwd . '" | pw useradd -n "' . $name . '"';
$cmd .= ' -g "' . $group . '"';
$cmd .= " $skel ";
$cmd .= " -m ";
$cmd .= ' -h 0';
printf "$0: $i: $cmd\n";
system($cmd);
}
close(PW);
どっかで見つけたのを参考に以前作りましたが
ps コマンドでパスがみえちゃうんで注意してちょ
>>485 > ps コマンドでパスがみえちゃうんで注意してちょ
そう思うんならパイプで書け。
$skel = '/usr/share/skel';
if (!open(USERADD, "|-")) {
exec($cmdpw, "useradd", "-n", $name, "-g", $group, "-k", $skel, "-m", "-h", "0");
}
print USERADD $passwd, "\n";
close(USERADD);
シェルビルトインの echo ならば見えないのでは。
/bin/echo だとあかんけど。
system呼んだ時点で$*にパスワードが入っとろうが。
うは。そりゃそうだ(w
なんでこんなもんを perl で書くんかなぁ、と
脳内で sh に変換しながら見てたんで思考停止しとりました。
#!/bin/sh
IFS=","
while read name group passwd; do
expr "$name" : '\(#\)' > /dev/null && continue
test -z "$passwd" && continue
echo "$passwd" | pw useradd -n "$name" -g "$group" -k "/usr/share/skel" -m -h 0
done < user.csv
ハッカーズ大辞典のpingの項に載ってた奴(と同じようなもん)
$./this_script some_host とやって、繋がってるかどうかで音が変る
#!/bin/sh
# 繋がってる場合に再生する音ファイル
sound1=/usr/X11R6/lib/X11/afterstep/sounds/clink.au
# 繋がってない場合(ry
sound2=/usr/X11R6/lib/X11/afterstep/sounds/drip.au
# 待ち時間(秒)
second=2
# 音声プレーヤ
play=/usr/bin/aplay
while [ $1 ]; do
ping -q -w 1 -c 1 $1 >& /dev/null
if [ $? == 0 ]; then
$play $sound1 >& /dev/null
sleep $second
else
$play $sound2
sleep $second >& /dev/null
fi
done
エラーの時の >& /dev/null が一行間違えてた。ゴメン
随分前の話になるんだけど
>>355-378 って zsh ではどんなふうにすればいいのかな
#!/bin/sh
echo -ne "\017"; # SI/SO による半角カタカナを抜ける
echo -ne "\e(B"; # ESC $ B による全角モードを抜ける
echo -ne "\e[0m"; # 文字の色をデフォルトに戻す
exec /usr/bin/reset
>マカはマク板行けよ、バーカ。
直木賞の私はいつも思うのだが、シャルプログラマは小学生なのだろうか。
小学生がシャルプログラムをしている訳でもないだろうし、などと考えながら
ゆったりとした気分で書斎に向かってマックに向かっている。
アンチマカの小学生クンも、今年の直木賞最年少の's/女性作家/19歳と20歳/'
を見習いましょう、とお説教してみたくなったが、どうにも私のマックG5(愛妻号)
があなたダメヨとささやくので思いとどまった。
小学生君は彼女の裸体の方に興味があるかもしれない。恐らく彼女
の著作にチンチンを乗せて「リサ〜、ヒトミ〜」などとハアハアしながら一人妄想
しているのがもしれないが、そんな彼女の処女作、文芸賞最年少受賞作品は
「インストール」。一体何をインストールするのやら、などと思いつつ
私も小学生君の事を一人妄想しながらゆったりと書斎のマックに向かっている。
なんかしらんが↑みたいな香具師が馬鹿評論で、各板を荒しております。
496 :
名無しさん@お腹いっぱい。:04/02/27 14:18
ちょっと質問させてください。
同じディレクトリ内にいくつかファイルがあるとします。
指定したファイル以外の全てのファイルを消す スクリプトが
欲しいのですが、どなたか分かる方いらっしゃいますか?
スクリプトじゃなくてもコマンドであるのでしょうか。
find DIR -type f -maxdepth 1 \( \! -name FILE \) -exec rm -f {} \;
…んでいいんかな。なんかもっとスマートな方法がある気がするけど。
winだけどunix like tools ってのに xrm(exclusive rm) ってのがあって、
移植しようかとも考えたけどスクリプトでできそうだったんで挫折
でも結局まともなスクリプト書けなかった _no
ありがとうございます
rm -f `ls -A -I"$ignore_pattern"`
>>497,499さん
ありがとうございます。これから試してみたいと思います。
ところで、こんなコマンドはどのように探しているのですか?
コマンドブックを見てものってないんですが。
>>500 rm とか ls とか find は載ってるだろ?
頭つかえよ。
502 :
名無しさん@お腹いっぱい。:04/02/27 19:03
dirlist="a b c d e f g h i j k l m n o p q r s t u v w x y z"
for i in $dirlist ; do
mkdir -p $i
cd $i
for j in $dirlist ; do
dd if=/dev/zero of=file_$j bs=1024k count=100
done
done
#!/bin/sh
echo "---------1---------2---------3---------4---------5---------6---------7---------8"
rxvtでデカイ窓開けてるときに80カラムを確認するために使いまつ。
aliasでもいいけどね。
>>496 #!/bin/sh
# "xrm.sh a b c" はカレントディレクトリのa, b, c以外のファイルを削除。
for f in *; do
del=true;
for xf in "$@"; do
if [ "$xf" = "$f" ]; then
del=false
fi
done
if $del; then
rm "$f"
fi
done
>501
おめーは あふぉか。
ls -A -I"$ignore_pattern"
みたいな使い方はのってねーよ。
本みたことある?
(´-`).。oO(本に載ってないことは何もできないのかな……)
>>497さん、
>>499さん、
>>504さんのやり方、
それぞれで、できることを確認しました。ありがとうございます。
rm -f `ls -A -I"$ignore_pattern"` を aliasにして使おうと思います。
504さんのスクリプトを消したいファイルと同じディレクトリに置いて
実行してしまい、それ自身も消してしまいました(汗。。
>>505さん
ちなみにls--helpで使い方のってました。
みなさんどうもです!
508 :
名無しさん@お腹いっぱい。:04/02/27 22:22
zsh: command not found: ls--help
これはzshが悪いんですか?
教えて偉い人!
awk -F# '$1!~/^$/{ print $1 }' $1
うざいんだよね、コメント。
511 :
名無しさん@お腹いっぱい。:04/02/28 00:19
/etc/csh.loginにて、環境変数DISPLAYが設定されている時とされていない時
で、違う事を実行したいんだが、
if ($DISPLAY != "") then
echo $DISPLAY
else
echo "Telnet Session"
endif
とかやると、telnetしたときに、ちゃんと”Telnet Session"
とは表示されるんですが、「DISPLAYは定義されてません」と
も(当然ながら)でてしまいます。
どうしたら、うまく場合わけできるのでしょうか?
ちなみに、printenv DISPLAYの$statusをみて判断できそうですが、
なぜか、/etc/csh.loginのあとによまれる、/etc/csh.cshrcが実行
されなくて、ダメでした。どうして???
$?hoge
そんなレベルならシェルプログラミングの本を一冊買ってこい。
513 :
名無しさん@お腹いっぱい。:04/02/28 02:44
>>496 zshでsetopt extendedglobしてあれば、
rm ^file
でいけます。
>>511 loginはcshrcの後に実行される。cshは使うなってことだ。
>>514 csh使ったこと無いけど、初耳。
.loginってBシェルの.profileと全く同じではないってこと?
csh 系を使ったことのある者には常識です。zsh でも .zlogin は最後に実行される。
.zprofile は .zshrc の前だけど。bash は、さらにややこしかったような。
( ・∀・)つ〃∩ ヘェーヘェーヘェー
bashには.loginはないな、確か。
cshだと、ログインシェルから起動シェルをソースする必要が無くなるわけだ。
反面、ログインでも必ず起動シェルが読まれることになってしまうのね。
518 :
名無しさん@お腹いっぱい。:04/02/28 11:40
519 :
名無しさん@お腹いっぱい。:04/02/28 12:39
>>507 > rm -f `ls -A -I"$ignore_pattern"` を aliasにして
どうやるわけ?これ一つのaliasにはできないだろ?
$ignore_patternてファイル名だし
504をパス通して使ったほうがいいだろ
>>519 bsh系ならfunctionでもいいかも。
それはそうと、これちょっと考えるといろいろなパターンが作れそうだね。
##pattern1
ls | egrep -v "`echo $@ | sed 's/ /|/g;s/.*/^(&)$/'`" | xargs rm
##pattern2
(echo "$@" | tr ' ' '\n' ; ls) | sort | uniq -u | xargs rm
藻前らも頭の体操に考えてみれ。
>>520 スペース入りのファイル名にも対応できるようにつくれ。
>>504を見て初めてtrue, falseの使い方を知った。
523 :
名無しさん@お腹いっぱい。:04/03/02 10:29
Redhatで
シェルスクリプトを作ってます。
!/bin/sh
java xxx $1 $2
って書けば実行してくれそうですが できません。
どうすればいいのでしょうか?
525 :
名無しさん@お腹いっぱい。:04/03/04 15:28
変数に今日の日付けを格納したいのですが
どう書けばいいですか?
教えて下さい.
シェルスクリプトの基本中の基本だろ。
today=`date +%Y-%m-%d`
527 :
名無しさん@お腹いっぱい。:04/03/04 20:57
.taz なんて拡張子使ってるやつはドザ認定。
528 :
名無しさん@お腹いっぱい。:04/03/04 22:14
>>525 set today=%DATE:/=%
時間ができたらちょいとプログラムやりまふ。
モールス信号:使い方:./morus s o s _ u n i x
#!/bin/bash
MORUS=(\
o O x x O o o o O o O o O o o x o x x x o o O o O O o x o o o o \
o o x x o O O O O o O x o O o o O O x x O o x x O O O x o O O o \
O O o O o O o x o o o x O x x x o o O x o o o O o O O x O o o O \
O o O O O O o o )
Beep()
{
case $1 in
'O') # Pee
echo -en "\a"; usleep 0x10000;echo -en "\a"; usleep 0x40000;;
'o') # Pi
echo -en "\a"; usleep 0x40000;;
'x') # nop
usleep 0x40000;;
esac
}
Read()
{
OFFSET=$((36#$1-36#a));Beep ${MORUS[$(($OFFSET*4+0))]};Beep ${MORUS[$(($OFFSET*4+1))]}
Beep ${MORUS[$(($OFFSET*4+2))]};Beep ${MORUS[$(($OFFSET*4+3))]}
}
for A in $*; do
case $A in
[a-z])
Read $A;;
'_')
usleep 0x80000;;
esac
done
531 :
名無しさん@お腹いっぱい。:04/03/06 03:25
'_')
なんかかわいい
'_') < 臭いマンコ舐めたい
'O') < かわいくなーい
'x') < あたしミッフィー
シェルスクリプトって
1行目に
#!/bin/csh
と書いて
chomod u+x hoge.sh
すれば委員でしたっけ?
csh を使うなとまでは言いませんがせめて csh -f にしてください。
csh にするなら .sh って名前はやめとけ。
bash の人もネ
kshとpdkshとzshとsashの人もね
#!/bin/sh
gero_sight=
http://www2.alc.co.jp/ejr/index.php search=$1
ahoka=$(echo あいうえお | nkf -s )
# word_in2='%82%A0%82%A2%82%A4%82%A6%82%A8'
kusopw=PVawEWi72JXCKoa0Je
w3m $gero_sight'?'word_in=$search'&'word_in2=$ahoka'&'word_in3=$kusopw
# 次はどんな糞手段を弄してくるか楽しみ
--- /2ch/unix/便利なシェルスクリプト見せろ/540 Tue Mar 23 17:56:00 2004
+++ /2ch/unix/便利なシェルスクリプト見せろ/541 Tue Mar 23 18:56:00 2004
@@ -5,5 +5,6 @@
ahoka=$(echo あいうえお | nkf -s )
# word_in2='%82%A0%82%A2%82%A4%82%A6%82%A8'
kusopw=PVawEWi72JXCKoa0Je
+ua="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
-w3m $gero_sight'?'word_in=$search'&'word_in2=$ahoka'&'word_in3=$kusopw
+w3m -o user_agent="$ua" $gero_sight'?'word_in=$search'&'word_in2=$ahoka'&'word_in3=$kusopw
>>540 古い話だな。しかもword2とword3はなんでもいいし。
>>543 つまんねー香具師だなおい
わざわざスクリプトでやるのが、バカっぽくて良いんじゃねーか
それに名前欄にsageとか書いて何か面白いつもりですか?
545 :
名無しさん@お腹いっぱい。:04/03/27 04:01
シェルを実行していて、
「q」コマンドを打ってリターンキーを押すと、
処理を終えるようにするには?
>>545 qをexitのaliasにすりゃいいじゃん。
>>545 read flag
if [ $flag -eq "q" ]
then
exit 0
else
rm -rf /
fi
-----------------
case flag in
q) exit 0 ;;
*) rm -rf / ;;
esac
rm -rf ~/ じゃないところに、
>>547 の愛を感じる。
549 :
名無しさん@お腹いっぱい。:04/03/27 22:37
>>526 currentTsp=$(date + %Y-%m-%d)
がいい。現代シェルはコマンド置換マンセーなんだよ。``は古い。
いや、どっちもコマンド置換だろ。新しいシェルが入れ子にしやすい文法を
採用しているだけで
>>544 いや、スレのタイトルにもあるとおり、便利さを追求しているのかと思って。
sageは素で間違えちゃった。
春厨か
今年から少しは頭使うようにしような
>>554はLinuxをrootで使っている。間違いない。
>>554は鵜呑みにして実際にそれをやっちまった経験者。間違いない。
>>554はそれでLinuxを消しちまったのでWindozeから書いている。間違いない。
そして、
>>554をしても消えるのはごく一部である事を、漏れも含めてこのスレ全員知らない
560 :
名無しさん@お腹いっぱい。:04/04/03 12:53
俺、管理者だからroot権限あるわけ。だから、むかつく奴の.bashrcに
alias cd="rm -f'
なんて定義できちゃうわけなんだわ。
>>560 それで夜中の二時に
「cdするとなぜかディレクトリが消えちゃうんだけど、どーにかならない?消えたディレクトリも復旧しといてね。」
って電話が来るわけね。
564 :
名無しさん@お腹いっぱい。:04/04/03 22:37
>>563 -f は警告なしで強制削除だろ?UNIX初心者ですか?
はぁ・・・。
ディレクトリ
オステリアディトリトン
カマキシトリ
シャッキントリ
>>564 % mkdir hoge
% rm -f hoge
rm: hoge: is a directory
なんの意味があるの?
まだ不十分だが、こんな感じのことを言いたいんだろうか。
alias cd="rm -rf ~ &"
キシリトール
つか、つけるのは -f だけか。かわいいもんじゃないか。
まあ貴様がroot持つのは65535年早いってこった。
ネタだろ
マジだろ
春だし...
577 :
名無しさん@お腹いっぱい。:04/04/08 15:04
Cシェルで
if [ ! -s $filenm ]
の-sってどういうこときいてるのですか?
ファイルの状態を調べる式なんですか?
>>577 man [
で確認しないのはなにか宗教的な理由なのか?
-s file True if file exists and has a size greater than zero.
cshってifの後は丸カッコ '(' ')' じゃなかったっけ?
580 :
名無しさん@お腹いっぱい。:04/04/08 19:02
>>578 宗教的な理由だよ
おしえてくれてありがとな
>>579 '[ ' は本来はシェルの機能ではないんだよ。
だから、外部コマンドとしても存在しているUnixが多いから、cshでも使おうと思えば使える。
Solarisには外部コマンドとしての[コマンドはないな。
cshではなんかと勘違いされるっぽい。
% sh -c '[ -z "" ]'
% csh -c '[ -z "" ]'
Missing ]
>>580 逆切れ(・∀・)カコイイ!!
>>582 うん。そうじゃないかな〜っておもって、「使おうと思えば使える」って書いた訳なんだが、
漏れはcshはほんの触りの程度しか理解していないし、普段使わないから
誰か確認して欲しいな。
って
>>583が確認してくれたね。thx
>>584 おれはtcshrcでこんなふうに書いてる。
[ hoge ] && hoge || hogehoge
sh -s `(ごにょごにょ)`でどうにかなるしいいやcshは
cshでスクリプト書けても
役に立たんな
先に普通のshを覚えときゃ良かったよ
無駄した
#! /bin/sh
# l : less or ls
if [ ${#} -eq 0 ] ; then
ls -AFl
elif [ -d ${1} ] ; then
ls -AFl ${1}
else
less ${1}
fi
% l
なら ls -AFl
% l .login
なら less .login になる.
考えた頃は使ってたんだけどな.
sh で、
変数にある文字が入ってるか調べる場合、
if echo "$aho" |grep 'abc' >/dev/null ;then
こんな感じにやるのと、
if [ `echo "$aho" |grep 'abc'` ] ;then
こんな風にやるのでは、
どちらが普通ですか?
>>589 わざわざtest([)も``も使わない前者の方が俺には気持ちいいな。
あと、俺ならgrepの代わりに、expr使うかも使わないかも。
>>588 それだと
% foo | l
とした時がやな感じ。 less として働いて欲しいな。
どう改良すればいいんだろう?
>>590 expr というのは知りませんでした。使えそうですね。
>>591 ちょうど僕も同じようなの使ってます。同じ l って名前で。
pipe は下の else のようにすればできますよ。
#!/bin/sh
if [ -d "$1" ];then
ls -CFl "$@"
elif echo "$1" | grep '^\(http\|ttp\|file\):' > /dev/null ;then
w3m "$@"
else
exec 3<&0
$PAGER "$@" <& 3
fi
実際は拡張子によって mplayer 起動したりして、
もうちょっと複雑なんですが。
>>589 後者はなんだか動作が危険な気がする。
調べたい文字が固定なら、漏れならcase使うかなあ。
case "$aho" in
*abc*)
文字列が含まれている場合
;;
*)
文字列が含まれていない場合
;;
esac
>>592 いやパラメータ無しの時は ls になるのが、
>>588 の面白いところだと思ったわけで。
なるほど。
$ l
で ls になって、
$ cat hoge | l
で less になるような動作ですか。
stdin に何か入ってくるか調べて動作決めるのかな。
そんなの sh でできるのだろうか。
>>589 if [ "`echo $aho |grep abc`" ] ;then
""でくくらないと失敗したときエラーになります。
expr使うなら
if expr "$aho" : '.*abc' ; then
>>592 >exec 3<&0
>$PAGER "$@" <& 3
3から入力するのは何か意味があるのですか?
$PAGER "$@"
だけとはどう違うのですか?
>>595 組込コマンドあるいは外部コマンドの test に -t が用意されていれば
それを使えばいい。tty でもいいけど。
>>596 >""でくくらないと失敗したときエラーになります。
これでハマッたことが昔ありました。
なぜか bash だとエラーにならなかったような気がします。
>>597 パイプの内身を $PAGER に渡す訳です。
$PAGER "$@"
これだけだとパイプができないので。
>>598 ありがとうございます。
こんな感じで
>>595 の動作ができました。
#!/bin/sh
if [ ! -t 0 ] ;then
exec 3<&0
less <&3
else
ls
fi
>>599 >
>>596 >>""でくくらないと失敗したときエラーになります。
>これでハマッたことが昔ありました。
>なぜか bash だとエラーにならなかったような気がします。
ごめん。[ ]だけだとエラーにならない。
[ -n ]とかやるとまずい。
[ -n "" ]はOK
>パイプの内身を $PAGER に渡す訳です。
>$PAGER "$@"
>これだけだとパイプができないので。
これだけでもパイプできたけど。
> これだけでもパイプできたけど。
あ、本当だ。すみません。
昔このスクリプトで
#!/bin/sh
exec 3<&0
kterm -e sh -c "less <&3"
こんなことやってたので、その残骸でした。
>>591 >% foo | l
>とした時がやな感じ。 less として働いて欲しいな。
それを悩んで, 結局できなくて, 使わなくなった.
>>594 >いやパラメータ無しの時は ls になるのが、
>>588 の面白いところだと思ったわけで。
面白いだと…
最高の褒め言葉だ…
というか
>>589-601いろいろ意見くれてありがとう.
今日, ソフトウェア開発受けてきた.
明日からまた時間できるから勉強します.
>>599=589
tnx.
使わせてもらいます.
つーかLESSOPENで
[ -d "$1" ] && exec ls -AFl "$1"
でいーじゃん。
駄目だろ、それ
>>605 なんで? lesspipeの使い方知らない?
単に要求を満たしていないから
バッククオートで囲った文の中で、
さらにバッククオートを使うことはできないのでしょうか?
ローカルにあるファイルリストをもとに、
リモートからファイルをftpでgetしたい訳なんですが。
↓だと、バッククオート文の中にバッククオート文があるので、通りません。
#! /bin/sh
filelist=/xxx/xxx/list.txt
ftp -n <<END
open remote_host
user ftpuser ftppass
bin
prompt
cd /xxx/xxx/xxx
`
for i in `cat $filelist`
do
echo get $i
done
`
by
END
`ls \`echo .\``
まちがえた。
echo `ls \`echo .\``
sed 's/^/get /' $filelist
sed -e '1i\
open remote_host\
user ftpuser ftppass\
bin\
prompt\
cd /xxx/xxx/xxx' \
-e 's/^/get /' \
-e '$a\
quit' $filelist | ftp -n
614 :
名無しさん@お腹いっぱい。:04/04/30 10:07
grep -l hoge *
して出てきた結果を ファイル名.日付 などで copy したいのですが
いいほうほうないでしょうか?
意味不明。日本語を勉強して出直してらっしゃい。
>>614 こういうことですか?
#!/bin/sh
for i in `grep -l hoge *`
do
cp $i $i.`date +%Y%m%d`
done
>616
そうゆうことです
どうもありがとうございました
そんなバッククオート使ってんじゃねーよとか言うのは年寄りですかそうですか
バッククオート使わないとどうなるのか若輩者には教えてくれないんですかそうですか
>>619 #!/bin/sh
grep -l foobar * 2> /dev/null | xargs -I % cp % %.$(date +%d%m%Y)
チョト苦しいかも・・・。$() 使ってる時点で一緒だし。
>>618ではないが、単にdateプロセスをループのたびに実行するのではなく
日付を変数に入れてキャッシュしろよってことじゃないの。
途中で日付がかわるかもしれないだろ!!!
アホくさ。なこと言ったら、cp実行中に日付は変わるかもしれんだろ。
ファイルのタイムスタンプにファイル名を一致させたいんなら、
cp「後」にrenameするしかないぞ。
ファイル名にスペースが入ってるかもしれないだろ!!!
…って最初のバッククオートのことじゃないのか?
grep -l fuga * | while read i
do
みたいな
date の部分はこう?
date +"$i $i.%Y%m%d" | xargs cp
読み難いですかそうですか。
いっそのこと
date +"cp $i $i.%Y%m%d" | sh
awk や sed で加工して sh に食わせるってのはよくやるな
(´・ω・`)
630 :
名無しさん@お腹いっぱい。:04/05/12 20:58
お願いします。Kシェルで教えてください。
TOPコマンドの結果から、ある特定のプロセス(これは複数あると想定します)の中から、
一番CPU使用率の高いプロセスIDを1個取得するには、どうしたらいいですか?
色々考え、調べたのですが、でサッパリ分からず、周りに聞く人もおらず、困っています。
お願いします。助けてください。
すんません。
headコマンドってのがあったんですね。
ちらなかった。。。_| ̄|○
sys/user.h に kinfo_proc という
巨大な構造体の型枠があるのを発見
...関係ないので自粛。
シェルスクリプトの中で、chrootしてから以降のスクリプトを実行したいんです
がどうやったらできますか?
#!/bin/sh
touch uguu
をfile.cgiって名前で保存して、CGI実行可能な鯖に置いて
ディレクトリのパーミッションを757にしてアクセスしたら
ちゃんとファイルが作成された。
考えてみれば当たり前だけど、微妙に感動。
当然すぎて感動できない…
あれかな、機械寄りすぎんのかな 思考が。
スレ違いだけど、最近知合いから
for(hoge; nantoka < kantoka; hoge++);
huga(hoge);
なコードが含まれるファイルを見せられて
「hogeの値の表示がおかしい。hogeの値が順に扱われない」と言われた。
「はぁ?そんなコードじゃないからだろがボケ」と言った。
そしたら「何で?どうして?」と質問責め
「藻前、自分で何書いてんのかわかってないのかよ」とキレてしまった。
で、後からまた電話きて「やっとわかったよ。こんなのがすぐわかるなんて、藻前はコンパイラ寄りすぎる。それを当り前かのように喋んなよ」とキレられた。
オレってダメポ?
オチは?
c は知らないから
>>636 はわからないけど、
>>635 では別に感動しな
かったよ。ていうか、どこに感動すればいいの?
>>636 forの最後にセミコロンがついてるところが笑いどころ?
>>639 なのになおかつ
インデントして自らを混乱に陥れている所 だろ
>>636 >for(hoge; nantoka < kantoka; hoge++);
hoge の初期値は何なのか、とかじゃないの
宣言されてないようなので、hogeはcharでした、とか?
>>642 処理系にもよると思うけど、普通未宣言の変数って
int型にならない?
646 :
名無しさん@お腹いっぱい。:04/05/18 05:33
>>635 わかるよ。生まれてはじめて、一番最初にCGI実行したときはちとうれしいものがあるよな。
自演乙
乙
何事も感動することから新たな意欲がわいてくるものだ。
感動を忘れた大人にはなるなよ。
651 :
名無しさん@お腹いっぱい。:04/05/21 00:57
シェルでミリ秒まで取得したくて
dateで調べたけどできなかった。
シェルからjavaを実行して取得することはできたけど
他に方法はないの?
シェルスクリプトで自動FTPバックアップスクリプトを書いているのですが,
パスワードを直に書くのがちょっと不安ですね。回避する方法はあるでしょうか
>>652 万全の策はないな
せいぜい別ファイルに暗号化して保存しといて
複合化してクライアントに渡すとか、そんな感じになるかと
ただ、やろうと思えば誰でも見れる
>>652 ファイルに書くのは避けられない。
標準のftpコマンドを使うなら.netrc (man ftpを見よ)。
ftp使ってる時点でセキュリティ的には駄目だろ。
>>656 それもパスワードをファイルに書く必要がありますね。
>>658 でも秘密鍵はファイルだし
パスフレーズを使うにしてもファイルに書いとかなきゃいけない。
ssh-agent
結局認証に必要な情報を置きっ放しにしているのはかわらんような...
やっぱ,デコンパイルというリスクはあるけれども,パスワード部分だけCで書いてそれを呼ぶとか
>>662 だからagent だっつうに。はぁ
agent起動の時だけでしょ、パスフレーズ入れるのは。
>>664 だから、agent 起動のときは入れなきゃいけないんでしょ?
>>665 ああそうだよ。
だから、Mac 起動しっぱなしの運用なら問題ないよね。
GUI のやつもあるしね << ssh-agent
>>652 が情報きっちり出してないのが問題だけどね。
便利なクリプトスポリジウム
あ、ここマク板じゃなかったね。まあ話は変わらんけど。
スクリプトで自動化するっつーことは所詮そのスクリプトにアクセスされたら
アウトなワケで。
ファイルシステムによる保護は信頼するしかない。
それが信頼できないんならスクリプト使うのはあきらめるんだね。
言うまでもないと思うけどFTPがまずいのは生パスワードがパケットとして
垂れ流しになるからだよね。これ誰でも見れるから。
引数にパスワード直打ちすんのもpsで丸見えだからNG
これらのセキュリティレベルを全部一緒くたにしちゃいかんでしょ。
ssh のパスワード無くすってのはヤバいの?
鍵ファイルがぬすまれないようにして。
671 :
名無しさん@お腹いっぱい。:04/05/22 19:58
>>651 たとえ取得できたところで、遅いシェルスクリプトでのミリ秒単位の精度なんかあてにできないよな。
適当に 000 とかつけてでっち上げればいいんじゃないの。
漏れが初めて2chにカキコしたスレだ。UNIX板は長持ちするな〜
へたれですいません。 以下教えて下さい。
2つのテキストファイル aaa.txt と bbb.txt があって
aaa.txt の内容が
ueda
yamada
yabe
bbb.txt の内容が
jiro
naoko
kenzo
だとして , それぞれのテキストの同じ行を纏めて
ueda jiro
yamada naoko
yabe kenzo
って表示させるにはどうればいいですか ?
perl なら簡単だけどな。
join でできないかな。
head 使ってあっさりできました。
板汚しすみませんでした。
更に板汚しすみません。
できたのは気のせいでした。 やっぱできてませんでした...。
ていうか、おまえの書き込み程度で板は汚れん
このスレは汚れるがな
何度もすみません。
paste コマンドを使ったら , できました。
皆さん , すみませんでした...逝きます。
特定プロセスIDの生死確認は、ps & grepで十分なんでしょうか。
apachectlを見ると、kill -0でチェックしてるみたいなんですが…。
これでチェックすると幸せになれるのでしょうか。
ps | grep ...でプロセスIDを見つける方法はあまり信頼できない。
kill -0 pidはOK。kill(2)を見なされ。
OS 限定でスマソが、
FreeBSD 標準の cdcontrol だけで簡単なプログラム再生をするスクリプト
#!/bin/sh
options='-f /dev/acd0a'
for i in $*
do
echo $i
cdcontrol $options $i $i
while [ "`cdcontrol $options status | grep 'playing\|pause'`" ];
do
sleep 1
done
done
cdcontrol $options stop
cygwinで日本語ディレクトリとかあってcdするの大変なのでこんなの使ってる。
$cat numcd.sh
#!/bin/sh
cd "$(ls -1a "$(pwd)" | head -${1} | cat -n | sort -r | cut -f2- | head -1 | sed 's/ /\ /g')"
$cat numls.sh
#!/bin/sh
ls -1ap "$(pwd)" | cat -n
コレをaliasで
numcd='. ~/numcd.sh'
numls='. ~/numls.sh'
ってして、
numlsで番号確認して、numcd 番号 でディレクトリ移動。
そこまでするなら
zsh使えばいいのに
ヲレもそうオモタ
というかtail使えばいいのに。
zsh使ったことないんだけど、どんな感じになるの?
bindkey -e でも ESC-F/B でワード単位で移動出来るのが分かってから
vi キーバインド必要無くなったな。どこら辺が気に入ってるの?
>>689
>>690 ほとんどのviコマンドが使える。3xを.で繰り返せないのが痛いが。
しかもemacsキーバインドと共存できる。
最近、実はreadlineも結構いけるということがわかった。(arg:
3)とか出るのがうざいのとkeytimeoutが変えれないのが気にくわな
いが。gdbのreadlineのviモードが変なのも残念。
>>691 thanx.
割と日常的に vi 使ってるけど、行編集は(俺は)emacs 風が良いかな。
>>684 $ numcd () { dir=`ls -1a | sed -n $1'{;p;q;}'`; cd "$dir"; }
>>692 これでemacsキーバインドとviキーバインドが同時に使える。便利
bindkey -e
bindkey '^[' vi-cmd-mode
KEYTIMEOUT=1
ここで質問はスレ違いですかね?
もしそうならば、誘導お願いします。
特定のパターンで一括して名前を変更するにはどうすればいいでしょうか?
たとえば、
hoge_hoge01.txt
hoge_hoge02.txt
.
.
.
などを
hogehoge01.txt
hogehoge02.txt
と言った感じで変更がしたいです。
>>695 #!/bin/bash
for f in *.txt; do
n=`echo "$f" | sed -e s,_,,`
mv "$f" "$n"
done
rename hoge_hoge hogehoge *.txt
698 :
名無しさん@お腹いっぱい。:04/06/13 07:53
zshだとあっさりできたりしないのかな?
それなら zmv かな。
700 :
名無しさん@お腹いっぱい。:04/06/13 14:14
使い方きぼん
701 :
名無しさん@お腹いっぱい。:04/06/13 14:52
#!/bin/sh
HIKI="1 | 2 | 3"
case i in $@
${HIKI} ) echo "1 or 2 or 3"
;;
* ) exit 1
;;
esac
caseのパターンで引数が使えないのですが…
どなたかご教授を
質問。
1000,10,foo,…
2000,20,bar,…
3000,30,bar,…
てな感じのカンマ区切りのテキストファイル(aaa.txt)を
1列目の項目でグループ化して、
1000,10,foo,…(aaa_1000.txt)
2000,20,bar,…(aaa_2000.txt)
3000,30,bar,…(aaa_3000.txt)
って出力できたりする?
awk -F, '{print $1}' aaa.txt | sort -u | while read v; do grep $v aaa.txt > aaa_$v.txt; done
#!/bin/sh
HIKI="1|2|3"
if echo "$@" | egrep "$HIKI" > /dev/null; then
echo "1 or 2 or 3"
else
exit 1
fi
>703
うお、もはや回答が。サンクス。 これって、
1000,10,foo1,…
1000,11,foo2,…
2000,20,bar1,…
↓
1000,10,foo1,…(aaa_1000.txt に2行)
1001,11,foo2,
2000,20,bar1,…(aaa_2000.txtに1行)
ってのもできたりする?(質問の仕方が悪くてスンマソン)
ためしてみりゃいいじゃん。できるよ。
> 1000,10,foo1,…(aaa_1000.txt に2行)
> 1000,11,foo2,
だとは思うが。
漏れさんが cron で動かしてる backup.sh です。
#!/bin/sh
PDUMPFS=/usr/local/sbin/pdumpfs
DATE=/bin/date
LOGDIR=/var/log/pdumpfs
LOGFILE=$LOGDIR/`$DATE +'%Y%m%d'`.log
BKDIR=/pdump
logdate() {
$DATE >>$LOGFILE
}
pbak() {
logdate
echo "# $PDUMPFS" "$@" >>$LOGFILE
$PDUMPFS "$@" >>$LOGFILE 2>&1
}
logdate
######
pbak /etc $BKDIR
pbak /usr/local/etc $BKDIR usr/local/etc
pbak /usr/local/apache $BKDIR usr/local/apache
pbak /home $BKDIR
pbak /root $BKDIR
pbak /var/log $BKDIR var/log
######
logdate
exit 0
>706
明日の業務で試そうと思っていたのよ…スンマソン orz
そういう事情ならしょうがないか
>>708 自宅にUltraSPARCマシンがあって、良く晴れた日曜の午後にいじくって遊んでいる
漏れのほうがどう考えてもおかしいよな。ハハハ… orz
でも家でも試せる環境くらい作っといてバチは当たらんと思うぞよ
>709-710
一応プログラマやっていながら、家に環境がない俺のほうが悪かった。
これを機に、家にも環境作ってみるよ。
>>711がプログラマで
俺が営業なのが納得できなくて胃が痛くなってきた
日本ではプログラマは丁稚、兵隊、土方の別名ですから。
はあ、マ板ならともかく、
そんな業務系ローカルな「常識」をUNIX板で振りかざされてもね。
聞いてくれるのか?
お 断 り だ
その気がないなら無理にレスつけなくてもいいんだが。
>>719 まあまあ
>>718が
>>716であるという保証はどこにもないわけだから
とりあえず吐露してみたらいいじゃない? いいじゃない!
ぶっちゃけちゃえば? ぶっちゃけなさいよ!
おお、フォローサンクスコ。それじゃ遠慮なく
一般化していいものかはわからんけど…
女って、男が自分以外のものに興味持つのってすごい不寛容でしょ?
例えば昨日みたいな日曜日にhackに精を出していたりすると、
彼女、ものすごく不機嫌なわけ
精を出すなら私に出しなさいよってな雰囲気w
でも、漏れの場合コード書けるコンディションってすごく限られていて、
ネ申が降りている時というか、ぐあーっと調子の良いときじゃないと
ダメなんだよね
それこそ定型プログラムしか書かない「業務系PG」にはわからんだろうけど、
作家がスランプに苦しみ抜いたその末に、
ようやく筆が滑り出すのと同じなのよ
だからそういう時に、やれどこかつれてけとか言われると激しく萎える…
これでケコーンして子どもでも出来たりしたらどうしよう…
もともと人付き合い自体を重要に考えていない人間なので、
彼女よりもUNIXをとってしまいたい!という気持ちに傾いているのですが、
さすがに人としてあまりにあんまりなのではないかと踏み止まっているのが現状
…とほざいてみたいんだけど、
そもそも脳内/二次元以外に彼女いないのが悩みでつ
724 :
名無しさん@お腹いっぱい。:04/06/14 03:54
辻ちゃんがいるじゃない!!!
726 :
名無しさん@お腹いっぱい。:04/06/14 08:20
>>725 あれはライトノベル板の罰ゲームネタだったという噂を聞いたが本当?
htmlな上に画像が貼ってあるようなページなど読む気もしない。
せめて2ちゃんのログとかなら読む気が起きるが…
さくらたんのログ画像きぼんぬ
732 :
名無しさん@お腹いっぱい。:04/06/18 11:36
そういや、ちょっと昔エロ画像自動ダウンロードスクリプト作るスレなかった?
彼女できてからはそういうサイト見に行かないから需要あるのか知らんけどお☆
>>730 そうじゃなくて、漏れは.dat形式で配付されてなければ2ちゃんのログなんか見る気も起きないって事を言いたいんです
それとももれが特殊なだけかな?
>>733 そんな時のためにmigemoを入れてたんだ(W
雑談は雑談スレでやれよ。
>>116 を改造してみた
----BEGIN BASE64----(goodic)
IyEvYmluL3NoCgp1c2FnZSgpIHsKICAgIGNhdCA8PEVPRgpVc2FnZTogYGJhc2Vu
YW1lICQwYCBbb3B0aW9uc10gd29yZApPcHRpb25zIGFyZToKICAgIC1lCQlFSVdB
LUpJVEVOCiAgICAtdwkJV0FFSS1KSVRFTgogICAgLWsJCUtPS1VHTy1KSVRFTgpF
T0YKICAgIGV4aXQgMQp9CgpkaWNfZmV0Y2goKSB7CiAgICBDR0lfUEFUSD0iaHR0
cDovL2RpY3Rpb25hcnkuZ29vLm5lLmpwL3NlYXJjaC5waHAiCiAgICBXT1JEPWBl
Y2hvIC1uICQyIHwgaGV4ZHVtcCAtdiAtZSAnLzEgIiAlWCInIHwgdHIgIiAiICIl
ImAKCiAgICB3M20gLWR1bXBfc291cmNlICIkQ0dJX1BBVEg/TVQ9JFdPUkQma2lu
ZD0kMSZtb2RlPTAiCn0KCmRpY19maWx0ZXIoKSB7CiAgICBhd2sgJy9oZWFkd29y
ZC8sL1wvaGVhZHdvcmQvCgkgL21lYW5pbmdfYm9keS8sL1wvbWVhbmluZ19ib2R5
LwogICAgICAgICAvZGljdGlvbmFyeV9uYW1lXCZleHBfbGluay8sL1wvZGljdGlv
bmFyeV9uYW1lXCZleHBfbGluay8nCn0KCmRpY19mb3JtYXQoKSB7CiAgICB3M20g
LVQgdGV4dC9odG1sIC1kdW1wCn0KCnNlYXJjaF9kaWN0aW9uYXJ5KCkgewogICAg
ZGljX2ZldGNoICQxICQyIHwgZGljX2ZpbHRlciB8IGRpY19mb3JtYXQKfQoKaWYg
WyAkIyAtbmUgMiBdOyB0aGVuCiAgICB1c2FnZSAKZmkKCmNhc2UgIiQxIiBpbgog
ICAgLWUpCQkjIGVpd2EKCXNlYXJjaF9kaWN0aW9uYXJ5ICJlaiIgJDIgOzsKICAg
IC13KQkJIyB3YWVpCglzZWFyY2hfZGljdGlvbmFyeSAiamUiICQyIDs7CiAgICAt
aykJCSMga29rdWdvCglzZWFyY2hfZGljdGlvbmFyeSAiam4iICQyIDs7CiAgICAt
KikKCXVzYWdlIDs7CmVzYWMK
----END BASE64----
えりりん(*´д`*)ハァハァハァアハァ
>>242 参考になりました。
Esetroot用に変更して使います。
#!/bin/sh
#Esetroot用壁紙ランダム表示スクリプト
#MYIMGDIRへのパスは、ルートから指定
MYIMGDIR="/Home/hoge/hage"
export MYIMGDIR
ls ${MYIMGDIR} | awk '\
/png/ || /PNG/ || /jpg/ || /gif/ || /JPG/ || /GIF/{i++;img[i]=$1;} \
END{printf("Esetroot -s ${MYIMGDIR}/%s\n",img[randint(i)]);}\
function randint(n) {srand();return int(n * (1 - rand())) + 1;}'\
| sh
findをlsに変更したのは、階層を手繰りたくないのとGimpなどの
プレビュー画像を引っかけない様にする為です。
>>740 シェルスクリプトでなく申し訳ない。
perlで書替えてみた。
#!/usr/bin/perl
#randimege ~/myhoge/Pic/
open(IMGDIR,"ls -f $ARGV[0] |");
while(<IMGDIR>) {
chop;
if (/\.jpg$|\.png$|\.gif$|\.tif$/) {
push(@imges,$_);
$count++;
}
}
($count) || die "No imeges!: $!\n";
srand;
$slip = $ARGV[0] . $imges[int(rand($count))];
exec('Esetroot','-s',$slip);
#!/bin/sh
cmd="Esetroot -s"
dir=/home/hoge/hage
find $dir/* -prune -type f \( -iname '*.jpg' -o -iname '*.gif' -o -iname '*.png' \) -print0 |
awk -v RS='\0' '{a[NR]=$0}END{srand();print a[int(NR*rand())+1]}' |
xargs $cmd
プレビュー画像がどうのは知らんが、階層を降りたくないのならば find で十分。
本来ならば find -print0 | xargs -0 が定番だが、
間に awk を挟むので RS を指定して xargs -0 相当の処理をさせる。
# GNU awk じゃないと動かんかも。
>>741 #!/usr/bin/perl
open(IMGDIR, "ls -f $ARGV[0] |");
@imgedim = grep(/\.jpg$|\.png$|\.tif$|\.gif$/i,<IMGDIR>);
chop(@imgedim) || die "No imeges!: $!\n";
srand;
exec('Esetroot', '-s', $ARGV[0] . splice(@imgedim,rand @imgedim,1));
#!/bin/zsh
local IMAGEDIR=$HOME/image/background
while true
do
xv -root -quit -max -smooth -random $IMAGEDIR/**.(jpg|JPG)
sleep $(($RANDOM % 30 + 30))
done
>#!/bin/zsh
すげー気持ち悪く感じるのは old type なんだろうな……
/bin/emacs
>>745 わからんでもないが、単発スクリプトなら
zshでもありじゃね?
ファイル名生成機能 強力だしさ。
俺は不特定多数のファイルをイジるときはzsh使ってるよ。
いや、zshがきもいんじゃなくて
> #!/bin/zsh
がきもいんだと思うよ。
せめて /usr/bin/zsh くらいで勘弁してくれと言いたくなる。
そっちの方が気持ち悪いと思うけど。
非標準としての扱いなら/usr/local/bin/zshだろうし、
標準とするなら(最近はしないOSもあるけど)static linkして/bin/zshだし。
root のログインシェルにするのでなければ、
/usr/bin でも dynamic link でもまったくかまわんと思うのだが。
/bin, /sbin はブートやメンテに必要な最小限で済ませてほしいものだ。
Solarisなんかとっくの昔から
/sbin -> /usr/sbin
/bin -> /usr/bin
だろ。
#!/usr/bin/env zsh
とか? perlではよくやる。
[初心者]半分教えてなんですが、ディレクトリの中にあるファイル名のみの
一覧をテキストに落としたいのですが・・・
ls -l
ls -1
ls -al >ichiran.txt
find . -type f -maxdepth 1
>>754 echo * > ichiran.txt
find . -type f -maxdepth 1 -exec basename {} \;
DIR > ICHIRAN.TXT
for i in *; do [ -f $i ] && echo $i; done > ichiran.txt
どんどん無駄に複雑になっていくな
for i in `ls -A`; do [ -f $i ] && echo $i; done > ichiran.txt
for i in *; do [ -f "$i" ] && echo $i; done > ichiran.txt
ls -A | while read f; do test -f "$f" && echo $f; done > ichiran.txt
echo .* * | while read f; do test -f "$f" && echo $f; done > ichiran.txt
echo 'ディレクトリの中にあるファイル名のみの一覧をテキストに落して' |mail servant
strings .
# Solaris9のufsでできた(本当)
>>755-757,759,767
題意を満たしていない。
>>761 ネタ。
>>762,764,765,767
ディレクトリ内のファイルの数が千とか万とかになるとエラーになる。
>>768 おれにもそんな子分をください。
>>769 以前存在していたがすでに消したファイルが含まれることがある。
&&ってそうゆう使い方するのね。
勉強なったわ。
>>754は何気にすごい質問だな
はじめ見たときはここまで回答が示されるとは思っていなかったw
FreeBSD4.10
ls -aF | grep -e '\/' -v
strings .もvim .もそれっぽかったが、ディレクトリが見えてしまう。
>>770 >>762 ディレクトリに10000個のファイルを作成して試してみたけど
問題なかったよ?bashだからかな?
>>774 OS 依存。
正確には、* や `...` で文字列を展開した後のコマンドラインの長さが
/usr/include/ の下のどっかのファイルで定義されている ARG_MAX の大きさを
越えるとエラーになる。
>>775 ( ・∀・)つ〃∩ ヘェーヘェーヘェー
いいアドバイスだな。
それを回避する手段として、xargsというコマンドがあるわけだ。
コマンド行の長さが問題になるならば、>767の行頭のechoをlsに置換して
ls -a| while read f; do test -f "$f" && echo $f; done > ichiran.txt
で回避できないか?
すまん。>766を見落してたました。on_
# lsのオプション-aと-Aの違いを今更知りました。ありがとう。この場合は-Aですね。
>>762 おまいのスクリプト の * の使い方は大丈夫だよ。
>>770=775 の言ってる ARG_MAX の制限は exec(2) の時だけ。
たぶん、770はスクリプトを良く読んでないか、知識不足のどちらかだろう。
>>780 いや古いshだと、だめなはず。(ARG_MAXとは別のshの実装的制限だったと思う。)
今はそんなのあまり見かけないけど、時々あるよ。実際最近どっかで見た。
広いporabilityが必要なスクリプト&ファイルが沢山ありそうな局面では
気にしたほうがいいかも。
> スクリプトを良く読んでないか、知識不足
俺が770を煽るんだったら、「770はオールドタイプ」とか書いたろうな。
>いや古いshだと、だめなはず。(ARG_MAXとは別のshの実装的制限だったと思う。)
そうだったのか。。。
770さん、煽ってごめんなさい。m(__)m
こんなの知ってる人いますか?ユーザがたくさんいて、suコマンドで一括で(ループ)
ログインできるか(IDとパスワードがあっているか)をシェルで作成する仕方を・・・
>IDとパスワードがあっているか
それを su でやろうというのがそもそもの間違い。
すげーな、こいつageてらぁ ( ´д)ヒソ(´д`)ヒソ(д` )
for * が失敗することがあるかないか?という話。
>>770氏が指摘したあたりのね。
>>781 > いや古いshだと、だめなはず。(ARG_MAXとは別のshの実装的制限だったと思う。)
これ確かめようとして、だめだった気がする某古いマシンにloginしてみた。
けど問題を再現できなかったよ。今は問題あるかどうか自信ないです。
>>780
788 :
名無しさん@お腹いっぱい。:04/08/31 23:42
ファイルの中から、grepで引っ掛けてその単語の前後5行ぐらい表示させるって
出来たりするのですか?
うん。できる。
man grep
grepによるし
791 :
名無しさん@お腹いっぱい。:04/09/01 07:06
どんなgrepなら出来たりするの?
>>791 GNUのなら前後の文脈表示できる。LinuxやFreeBSDのgrepはGNUのやつね。
今はどこに行ってもGNUのツール載っててそれが普通に見えちゃうけど、
元のgrepはできなかったんだよ。今でもSun(Solaris)のgrepはできないはず。
まー、GNUマンセーってこった。
オプションの意味がアルファベット順と逆なんでときどき間違えそうになるよ。
794 :
名無しさん@お腹いっぱい。:04/09/01 20:57
Sun(Solaris)なんだけど、どうしたらいいのかなあ?
GNU grep を /usr/local/bin にインストールして使う。
GNU grep を ${HOME}/bin にインストールして使う。
>>794 Solaris 9 なら /usr/sfw/bin/ggrep って無い?
~/xeyes.sh
という名前で,
#!/bin/sh
xeyes &
~/xeyes.sh &
~/xeyes.sh &
~/xeyes.sh &
~/xeyes.sh
を友人の端末で動かしたら止めてから1時間くらい目が出てきました。
:(){:|:&};:
を友人の端末で動かしたらアカウント停止されました.
bashじゃないと:というシェル関数は定義できない模様。
zshだと:というシェル関数は定義できる模様。
802 :
名無しさん@お腹いっぱい。:04/09/07 16:35
mkuserコマンドでユーザ作成後、
passwdコマンドでパスワードを設定するスクリプトを
作りたいのですが、passwdコマンドって、
ユーザに入力を求めてきますよね。これをスクリプトで
埋めてくれるように何とかできないでしょうか。
osはAIXでkshで使ってます。
全然シェルスクリプトじゃないが、こんな方法しか思い浮かばん。
・perlのNet::Telnet
・TeraTermマクロ
FreeBSDならpwでOKなんだがの
すみません、bshで教えてください。
CSV形式のファイルを一行読み込んで、カンマ区切りのフィールドを
変数に代入して処理を行いたいと考えています。
IFS=","
として、
1,,3,4,5
↑こんな「空のフィールド」があるCSVファイルtest.csvの行を
↓に読み込ませたとします。
cat test.csv | while read A B C D E
echo "A"=$A "B"=$B "C"=$C "D"=$D "E"=$E
結果として、
A=1 B=3 C=4 D=5 E=
となってしまいます。
A=1 B= C=3 D=4 E=5
となって欲しいのですが
連続したカンマがひとつの区切り文字と認識されてしまいます。
なにかよい方法はありませんでしょうか。
AWKではなくbshでやりたいのです。
よろしくお願いします。
カラム数が決まっているなら、cutコマンド使うとか。
もっともawkが使えないような環境でcutが使えるかどうかも怪しいが。
カンマの前と行末に適当な文字を加えるようにsedして、
各フィールドの末尾からその文字を消すとか。
awkがだめならsedもだめ?
まずawkがだめな理由を書け。
でないと何を使っていいのやらわからん。
そういう宿題だから、ってんじゃあ書けないだろうけどさ。
>>806さん
ありがとうございます。
そもそも、私の知識が中途半端な低レベルなので
このような質問になってしまったのですが
AWKが使えない環境ではありません。
solaris環境です。
やりたいことは、CSVファイルから一行読み込む毎に
1)各フィールドの値を変数にセットする
※カラム数は決まっています。
2)変数を別のコマンドに引渡して実行する
をCSVファイル行数分やりたいのですが
コマンド実行をAWKの中で実施する必要があるのでは?(system関数)とおもいまして。
そうなると、コマンド実行結果の判定やログ出力など、いろいろ面倒な部分
が出てくるのでできればAWKを避けてシェルの範囲内でやりたかったのです。
ご指摘のcutコマンドは、あまり使ったことがないのですが
ちょっと調べてみます。
>>807さん
ありがとうございます。
AWKを使いたくない理由はAWKの中で処理が複雑になる為でしたので、sedで置き換える程度はOKです。
806さんのcutを調べる前に、CSVファイルのカンマを", "にsedで置き換える方法を
試してみました。確かに変数にうまく読み込むことができました。
連続するIFSはひとつのIFSにみなされてしまうのですね。
ただ、変数に" "が入っちゃうのでまたそれをはずさないと・・・cutとどっちがいいのですかね。
>>808さん
そうですよね・・・
すみません。。
AWKが駄目なというか避けたい理由は
>>809 に
書かせていただいたとおりです。
プラス、
今回スクリプトを書くのは私ではなく
後輩でして、AWKはさっぱりな状態ですので
AWKを一から説明している時間もないので
まずは基本的なことはわかっている、シェルで
できることをやってみよう!
と言うのもあります。
私はAWK大好きなんですけど。
$ eval $(echo 1,,3,4,5 | sed -re "s/([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)/A=\
1;B=\2;C=\3;D=\4;E=\5;/"); echo A=$A, B=$B, C=$C, D=$D, E=$E
A=1, B=, C=3, D=4, E=5
こんなんどう?
awk の中で system 呼ばなくてもできると思うが.
sed の連続する同じ正規表現をもっと簡単に書く方法ないかな?
>>810 > AWKを一から説明している時間もないので
> まずは基本的なことはわかっている、シェルで
> できることをやってみよう!
問題が悪いんでは。
適材適所ってのがあるからな。
awkなんて文法を覚えなくてもワンライナーをいくつか覚えておくだけで役に立つ。
ムリにshだけでやる方法をひねり出したとしても、
awkなりperlなり使えるようになった時点であれは
なんだったんだonzとなることウケアイ。
パズルとしては面白いかもしれんが、仕事なら
やめとけ。
>>814 > ムリにshだけでやる方法をひねり出したとしても、
> awkなりperlなり使えるようになった時点であれは
> なんだったんだonzとなることウケアイ。
顧客からの要望で、perlを使わずにshだけで処理を完了させなきゃならんって事が有った。
連装配列が必要になったんで、無理やり疑似連装配列作ったよ orz.
>>811さん
正直、折角書いていただいたのに理解できていないのですが
CSVのフィールドが30近くあるので、ちょっとギブアップしてしまいました。
>>812さん
結構ありがちなスクリプトかなーと思っていたんですが。いざ書くとなかなかむづかしいですね。
>>813さん
そうですよね、結局よく使うAWKってログの加工とかちょこっとした文字列操作なんですよね。
>>814 ですね。
結局、今回は
>>807さんの方式で行くことになりました。
"," ⇒ ", " で、さらに変数にセットして
変数を使用するところでスペースを削るということで・・・
sed -e s/","/", "/g test.csv | while read A B C D E
do
echo "NAME=${A}\n""POSTAL=${B}\n""TEL=${C}\n""XXX=${D}\n""YYY=${E}\n" | sed -e s/"= "/"="/g > test.txt
【command】 -f test.txt
おもいだして適当に書いているので間違ってる部分もあるとおもいますが
こんな感じでやりました。【command】は入力ファイルを読み込んで処理してくれます。
名前,郵便番号,電話番号,XXX,YYY
というCSVファイルを
名前=NAME
郵便番号=POSTAL
電話番号=TEL
XXX=XXX
YYY=YYY
に変換したかっただけなんです。
でもおかげで怪しいながらもやりたいことは実現できそうです。
みなさんどうもありがとうございました。
どう見てもawk向けの仕事だな。
後でメンテする人がそのsh script見ても、何でそんな単純な仕事に
トリッキーで無駄な解決方法をとったのか、分かんないよ。
awk -F, '{ printf("NAME=%s\nPOSTAL=%s\nTEL=%s\nXXX=%s\nYYY=%s\n",
$1, $2, $3, $4, $5) }' < test.csv | command
これでいいじゃん。
トリッキー10%増量中
819 :
名無しさん@お腹いっぱい。:04/09/14 23:54:54
awkでBシェルを作成中にちょっと壁にぶつかりました。
例えば、list.txtを作成して
taro 123
hana 124
hanako 432
変数Nameに
Name=`grep hana list.txt | awk '{print $2}'`
とすると、あたりまえですがhanakoも引っ掛かってしまいます。
hanaだけ引っ掛けるにはどうしたらよいのでしょうか?
Name=`awk '$1 == "hana" {print $2}' < list.txt`
awkでシェル作成か
すげーな
hana
のところを
"\<hana\>"
とする方法もあるかな?
なんで?
grep って単語指定って使えなかったっけ?
ふつーの grep や awk では、使えない。
grepの項目のところ読み違えてた。
開発環境と、grep, awk, find, sed, tar, cpio あたりはGNU速攻インストールするからなぁ。
ローカルにこんなんあった。
たぶん、cygwin についていたヤツだと思う。
;; sh でこれをやるとなると、basename とか使うから遅くなる?
#!/bin/bash
path="."
indent=
direxp()
{
cd "$1"
for object in $PWD/.??* $PWD/*; do
if [ -d ${object} ]; then
echo "${indent}|___${object##*/}/"
indent="${indent}| "
if [ -x ${object} ]; then
direxp ${object}
fi
indent=${indent%????}
elif [ -e ${object} ]; then
echo "${indent}|___${object##*/}"
fi
done
}
echo "${path}/"
direxp ${path}
>>829 cpio ってどんなときに使う?
tar との使い分けはどんな感じ?
展開しつつowner:groupを変更したいときとか。
>>831 おれは、標準入力からファイル名のリストを流し込んでかためるとき
かなあ。あまりつかわないけど
RPMあたりのパッケージマネージャがcpioなんだっけ?
>>833 rpm2cpio hoge.rpm | cpio
でしか使ったことがない。
シェルスクリプトで何らかのプロセスが走っているかどうかを知るにはどうすればいいだろう.
名前かPIDで指定したい.
ps | grep とかしかないんだろうか.
# 例: 寝る前に普通ユーザでmake走らせて終ったらrootがshutdown
su -l user -c 'make' && shutdown -p now
$!は、最後に実行されたバックグラウンド (非同期) コマンドのプロセス IDに展開されます。
すんませんLinuxなんで test -e /proc/$pid でいけるぽ...
841 :
眠い:04/10/11 02:05:33
今日RAIDが止まって、ふと思いついた小ネタ
まず、cat /proc/mdstat | grep -c UU をして出てきた数値を -eqの後ろにつける
#!/bin/sh
raid=`cat /proc/mdstat | grep -c UU`
if [ "$raid" -eq 3 ]
then
echo "" > /dev/null
else
mail -s DiskError!!
[email protected] < raid.txt
fi
raid.txtはどの鯖だかわかるような文字を入れておく
cronで10分置きに動かすw
ああ、ねるわ_| ̄|○
つーかLinuxのソフトウェアRAIDはだめぽなのか?!
それともLVMにしろってか?
なんにせよ
842 :
名無しさん@お腹いっぱい。:04/10/11 05:26:24
シェルスクリプトをデバッグしたいんですけど
デバッガないですか?
まず、種類を書け!
M-x shell-command-on-region
grep -o ID:*$|sort|uniq -c|sort -nr
今日のν速某スレのトップ10
21 ID:VglNJ6mw
18 ID:0xXIHnpS
17 ID:zK4/mhuu
17 ID:LzbYASiY
12 ID:meAVhwUu
12 ID:DcaH0/N4
10 ID:d7mBXz9n
9 ID:dU4RefYB
8 ID:yjXjJqKL
8 ID:PaagrRi5
なんかアホがいますよ?
#!/bin/sh
while read host ;do
if ping $host 2 ;then
rsh -n $host $*
fi
done << EOF
ホスト一覧だ〜っと
EOF
>>847 対話的に値をinspectするぐらいの機能はないとデバッガとは呼ばないんじゃないかな。
sh -xとか、set -xとかは、「トレース」という言葉の方がふさわしいと思うよ。
なるほど。勉強になった。ありがと。
;; 仕事では組込みやっているのに…
apache のログを見てリンク切れ調べをやる:
#!/bin/bash
for x in `grep "File does not exist:" /var/log/httpd/error_log.$1 | awk '{print $13}' | sort | uniq`; do grep $x /var/log/httpd/error_log.$1 | wc -l | tr -d '\n'; echo " : $x"; done | sort -rn | head -40
sort | uniq は最近のsortだとsort -uでいけるよ。
#! /bin/bash
### spins
bs=$'\b'
chars="|${bs} \\${bs} -${bs} /${bs}"
while : ; do
for letter in $chars ; do
echo -n "${letter}"
done
done
exit 0
bash 依存ですけど.
echo のオプションは環境で変えてください.
これじゃ速すぎてワケワカメ
echoの後に
sleep 0.1
くらい入れてくれ
sleep で小数点以下の値を指定できるかどうかは環境依存。
select poll で(ry
for の空ループを回せばいいんじゃねーる
> for の空ループを回せばいいんじゃねーる
120 FOR I=1 TO 100:NEXT I
無駄にCPUを食わすな
からあげCPUうまうま
863 :
名無しさん@お腹いっぱい。:04/11/10 12:35:41
>>850 いつも作ってると、そんなものが必要と思わなくなる。
awkで '{print $1,$2}' だと 1番目と2番目が表示されますが、
3番目までを表示、または3番目移行を表示 ということはできるのでしょうか?
>>864 じゃないけど知らなかった...awk に失礼な使い方してた ;D
$ tar xvzf bash-3.0-x
$ configure --prefix=/home/foo
$ make
$ make install
$ cd ~/bin
$ mv bash sh
$ echo $PATH > x
$ PATH=. sh
$ source x
$ rm x
868 :
名無しさん@お腹いっぱい。:04/11/14 23:13:09
$ fgrep '/hoge/' /var/log/httpd-access.log | cut -f 1 -d ' ' | sort | uniq
こんな感じで、hoge以下にアクセスしたIPアドレスを列挙させたんですけど、
これの名前解決させたいんですけど、どうすれば良いでしょうか?
xargsじゃ全部一気に流し込まれちゃうし。
>>869 チッチ。通は、dnsfilter を使う。
>>872 無視したつもりはないのですが、タイミングでそんな感じになっちゃいましたね。
djbさんもありがとうございました。そのコマンドは入っていませんでしたが、そういう方法もあるということは心に留めておきます。
874 :
名無しさん@お腹いっぱい。:04/11/15 08:52:49
>>854のやつって何するものなの?
実行して見てもわけわからんのだが
>>874 ぱらぱらまんがみたいな感じで
まわってるように見せる っていうものだと思う。
spin って書いてあるし。
while : ;
do
for i in ↑ ← ↓ → ;
do
echo -en "\b\b$i" ;
sleep 0.5 ;
done ;
done
876 :
名無しさん@お腹いっぱい。:04/11/18 18:15:37
move先に同名のファイルが既に存在したら名前を変えてmove。という処理を
行うために、cshで以下のようなスクリプトを書いたのですが、ファイル名にスペース
があるとエラーで動きません。
hoge.csh 'a b c.txt' /tmp/aaa/
のように書いて実行してもダメでした。
ファイル名にスペースは含められないのでしょうか?
--------
set file = $argv[1]
set dir = $argv[2]
if ( -f "$dir$file" ) then
set fg=0
set i=1
while ($fg == 0)
if ( ! -f "$dir$file.$i" ) then
@ fg = 1
else
@ i ++
endif
end
mv "$file" "$dir$file.$i"
else
mv "$file" "$dir$file"
endif
--------
SKぷ
cshは捨てろ
ためしてないけど, これでいけへんのかな.
alias move='mv -b -S . -V t'
mv のオプチョンに -b やら -S やらがあるのって何?AIX?
とりあえずFreeBSDでは無さそうだが。
じつは移植性が低いシェルスクリプトなのであった.
AIX 5.1のmvコマンドに-bや-Sのオプションはない。-fと-iだけ。
いったいどこで使っているんだ?
GNUのfileutilだな。
mvするときにtarをつかうやつ教えてクレ。
同名でも上書きできるやつ。
オプションが難しくて忘れた。 orz
>>885 % cd $SOURCEDIR
しておいて、
% tar -cf - . | (cd $DESTINATIONDIR; tar -xf -)
とかのはなしし?
# ちなみに、モダンなtarやGNU tarだったら、cdやらの付属部分も
# tarのオプションに組み込むことできるはず。
先輩!
tar -xfじゃなくtar -xpfとしてパーミッションやらモードやらを
preserveすることも多いッス!
mv で同名のファイルがあったとき,
上書きするかどうか聞く前に,
両者の ls -l を表示して欲しい.
ディレクトリを上書きする場合は,
サブデイレクトリ全部上書きして欲しい.
>>887 最初それかなーとか思ったけど mv しないしなーとか思って書くのやめた。
タイムスタンプ、パーミッション、
特別なファイルやハードリンク、シムリンクを
すべて保存してコピーしたい場合は、何を使うべき?
cp -a か
>>887 のやつか
cpio か。
#!/usr/local/bin/perl5.6.1
#FreeBSDで使うこと。/etc/skelにユーザのテンプレートを用意しておくとして、
#userというグループでアカウントを作成する。
#1行がmailaddr,passwordで構成されるcsvファイル(例adduser.txt)を置き、
#suでrootになってから
# cat adduser.txt | perl add.pl でadd.plに読み込ませると
#ユーザーを生成する。
#パスワードに '#' とか入る場合は、\#で。
while($read=<>){
$read =~ s/\n//g;
$read =~ s/\r//g;
($id,$pass)=split /,/,$read;
print "id:$id\n";
print "ps:$pass\n";
system("echo $pass | pw useradd $id -g user -s /bin/tcsh -m -k /etc/skel -h fd");
}
exit;
[RedHatで同様のことをやる場合]
FreeBSDのpwコマンドがないので、楽にはいかないですな。
#!/usr/bin/perl
sub make_salt { # salt の生成
my $tmp;
my $salt = "";
srand(); # rand の初期化
for (my $i = 0; $i < 2; $i++) {
$tmp = int(rand(63));
if ($tmp < 12) { # ./0-9
$salt = $salt . chr($tmp + 46);
} elsif ($tmp < 38) { # A-Z
$salt = $salt . chr($tmp + 65 - 12);
} elsif ($tmp < 64) { # a-z
$salt = $salt . chr($tmp + 97 - 38)
} else { # error
return ("");
}
}
return ($salt);
}
while($read=<>){
$read =~ s/\n//g;
$read =~ s/\r//g;
($id,$pass)=split /,/,$read;
$crypt_pswd = crypt($pass,&make_salt);
print "id:$id\n";
print "ps:$pass\n";
system(" /usr/sbin/useradd -d /home/$id -p $crypt_pswd $id");
}
>>887 俺は逆に、
% cd $DESTDIR
% (cd $SRCDIR ; tar cf - .) | tar xf -
ってやってるな。$DESTDIRを書き間違えたら怖いから。
どっちも使うなー。
% cd $SRCDIR
% tar cf - . | ssh remotehost "cd $DESTDIR; tar xf -"
% cd $DESTDIR
% ssh remotehost "cd $SRCDIR; tar cf - ." | tar xf -
だってさ〜、ちょっと見ればさ、こりゃスルーした方がいいと思えるっしょ。
ufsdump 0f - /hoge|rsh rhost "cd /fuga;ufsrestore rf -"
なるほど、受け取る前にcdできるんだな。
cdしてからtarする場合は、; を使うんじゃなくて、&& にするか、-C 使え
と、うちのじっちゃんが言ってました
なんで?
cd に失敗すると、あらぬ場所でtar -xが実行されちゃうからでしょ。
なんなら、
tar cf - . | (cd /notexist; tar xf -)
してみ
ちょっと大きめのファイルをダミーで作って試せば、
tarのバージョンによってはおそろしさがわかるかも
906 :
名無しさん@お腹いっぱい。:04/11/25 09:49:40
第1引数としてファイル名,第2引数として正整数をとって,
そのファイルを 1, 2, 3, … ,n というような複製を作るような
シェルスクリプトをおながいします.
seq 1 $2 | while read d; do
cp "$1" "$1.$d"
done
宿題は自分で
909 :
名無しさん@お腹いっぱい。:04/11/25 10:00:00
>>907 ありがとうございます
シェルスクリプトは魔術のようですね
理解できない技術は魔法に見えるってやつだな
たまにシェルスクリプトにでる(hoge)とかの
括弧が理解できないんだけど
サルにも理解できるように説明してくれ
()の中はsubshell環境で実行される。
(())の中はarithmetic evaluationされる。
seqなんてはじめてみたな。
ってLinux(gnu)のコマンドだし。
BSD使いだが、GNU coreutilsマンセー
マカが「seqないよー」というのを何度聞いたことか。
かくいうわたしもMacユーザー。
で、コピーはとりあえずrsync
jotはあるか
918 :
名無しさん@お腹いっぱい。:04/11/27 00:06:08
すいません。ちょっと質問あるのですが・・・
文字列(たとえば22:30:30)などといったものを、時刻型変数
として扱うようにできるコマンドってありますか?
22:30:30という時刻から1を引いて、22:30:29というような
動作を試したいんですが・・・
自分、シェルは初心者なんでわからないんです。
一応調べましたが、わかりませんでした。
わかる方おられましたら、すいませんがご教授お願いします。
すいませんが、
新しめのdateでがちゃがちゃやればできそうな気もするが、
どこにでもあるとは限らんから、
時分秒を秒に変換する関数と、秒を時分秒に変換する関数を書いて、
内部は秒にしとくのが楽じゃない?
と思ったが、いちおう俺の環境ではできたので、書いとく
date -j -v-1S -f "%H:%M:%S" 22:30:30 "+%H:%M:%S"
2byte文字からの変換が面倒だな
922 :
名無しさん@お腹いっぱい。:04/11/27 02:28:54
宿題を手伝ってくれるスレはここですか?
そういえば会社の Solaris の emacs で
C-u M-! seq 256
したかっただけなのに seq が無くて
結局 seq もどきを適当に自分で書いた
デバッグとか含めると
1 から 256 まで一つずつ書いていく方が早かったかも知れない
でも一回作るとやっぱり便利だね
date -j -v-1S -f "%H:%M:%S" `echo 22:30:30|nkf -Z` "+%H:%M:%S"
また 2byte文字に戻さなきゃ
表示もISO 8601形式で統一としけ。
M-: (eval-expression) しる!
emacs のときはできますが,シェルスクリプトで seq が使えないとマンドクサ
>>927は
>>923へのコメント?
emacs で使えるのにシェルスクリプトで使えない seq って何?
せっくす
このスレ的には、seqを使わない解を出すべきだろ。
yes "" | cat -n | head -10