5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【sed】シェルスクリプト総合@LINUX Part2【awk】

1 :ミスターバッシュ:2006/08/03(木) 13:10:00 ID:5dVnjkpT
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

前スレ
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

503 :login:Penguin:2007/02/01(木) 10:29:45 ID:7FjmZE6L
>>502
find /TESTDIR -maxdepth 0 -type d -empty

504 :login:Penguin:2007/02/01(木) 10:31:16 ID:7FjmZE6L
>>503
ちょっと違うか。
でもまぁ、find で空ディレクトリ一覧は出せるよ。

空のディレクトリのみ削除したいなら
いきなり rmdir しちゃうとか。

505 :login:Penguin:2007/02/01(木) 10:32:56 ID:7FjmZE6L
>>502
> if [ ! -f /TESTDIR/* ];then
これだと /TESTDIR/.test なんてファイルがあったらだめだな。

506 :502:2007/02/01(木) 13:37:30 ID:c0AyEF+O
>>505
そうでした。うかつです。
>>503
-maxdepth 0をつけるとなぜかファイルが入ってるディレクトリも
抽出されたのでfindで出来るというレスをヒントに

find /TESTDIR -type d -empty

で一見うまくいってるかも?です。少し様子見します。
ありがとうございます。

507 :502:2007/02/01(木) 13:53:02 ID:c0AyEF+O
と、思ったら失敗しました。

TESTDIRの下にディレクトリa,b,c,d...と初期にこちらで用意した
ディレクトリがありその初期ディレクトリで空のもののみを抽出した
かったのですが、ディレクトリaの下に通常のファイルの他に
空ディレクトリとか作られると

find /TESTDIR -type d -empty

でやるとディレクトリaの下の空ディレクトリも抽出されてしまいます。。

508 :502:2007/02/01(木) 14:48:33 ID:c0AyEF+O
自己レス
find /TESTDIR -maxdepth 1 -type -d
でうまくいきました。ありがとうございました。

509 :login:Penguin:2007/02/01(木) 14:50:50 ID:S77RcpST
find /TESTDIR -prune -type d -empty


510 :login:Penguin:2007/02/01(木) 21:48:28 ID:sTUB8jxJ
du

511 :login:Penguin:2007/02/01(木) 23:28:13 ID:ZVcHJobk
>>510
多分だめ(な場合がある)だろ。

LinuxのFS(たとえばext3)って、ファイルがないディレクトリのサイズは「必ず」0なのか?

他のUNIXでよくあるのは、いっぱいファイルを作った(当然ディレクトリのサイズ増大)後で、
ファイルを全部削除しても、ディレクトリ自体はすぐにはtruncateされない場合がある
ってな実装戦略なんだが。(この戦略は決してサボリじゃなく合理的理由がある)

512 :511:2007/02/01(木) 23:56:02 ID:ZVcHJobk
>>511みたいな複雑なケース以前にもっと単純に...

>>510
duだと、サイズ0のファイルが存在しても、それはないものとして数えられちゃうよね。

やっぱduのようにサイズを計るツールでファイル数を計るのは無理あるんじゃね?

513 :login:Penguin:2007/02/02(金) 03:11:38 ID:9L/PFxQe
find でやるのが正解だと思うけれど ls -A も使える。

for dir in /TESTDIR/*/ /TESTDIR/.*/ ;
do
count=`ls -A "$dir" | wc -l` ;
if [ $count -eq 0 ] ;
then echo "$dir": empty ;
fi ;
done

/TESTDIR/.*/ だと /TESTDIR/. と /TESTDIR/..
もマッチしちゃうけど。

514 :login:Penguin:2007/02/02(金) 07:25:12 ID:3bXppBjS
duで最小サイズのディレクトリを見付けfindする。

515 :login:Penguin:2007/02/02(金) 17:41:07 ID:DTfUN+wD
hogeを5秒後に起動したい

#!/usr/bin/sh
sleep 5 && hoge

516 :login:Penguin:2007/02/02(金) 18:05:04 ID:8alDMpKt
>>515
誤爆か?

3分後にカップラーメンを食べたい

#!/usr/bin/sh
sleep 3m && play /usr/share/sounds/login.wav

517 :login:Penguin:2007/02/02(金) 23:21:43 ID:DTfUN+wD
じゃあこれでいい?

3秒後にhogeを起動したい

#!/usr/bin/sh
sleep 3s && /usr/bin/hoge

518 :login:Penguin:2007/02/02(金) 23:25:24 ID:/lWC69nr
お前らatを知らんのか。

519 :login:Penguin:2007/02/02(金) 23:43:39 ID:tuwscbyy
atは許可されないと使えないわけだが。


520 :login:Penguin:2007/02/02(金) 23:59:13 ID:WEnZhawj
atd 動いてないかもしんないし。

521 :login:Penguin:2007/02/03(土) 00:00:23 ID:Lfu3L5NI
指定した時刻に電源がオンになるようなのはできますか?

522 :login:Penguin:2007/02/03(土) 01:40:12 ID:fL2Na2GQ
シェルスクリプトで、という意味?
普通はbiosとかの役割だと思うけど。

523 :login:Penguin:2007/02/03(土) 11:12:20 ID:6nwwXG2H
>>521
Wake On Ringコネクタにキッチンタイマーをつなげ。

524 :login:Penguin:2007/02/04(日) 01:35:42 ID:LvsFC69b
つ nvram-wakeup
これで次起きたい時刻をセットしてマシン落とせば(もしくはサスペンドすれば)おけ。


525 :login:Penguin:2007/02/12(月) 13:31:38 ID:SMeHWOZn
7za x *
というふうに*(ワイルドカード)が使用できないので
なんとかスクリプトで出来ないかとやってみたがダメ。
今いるディレクトリにある.7zすべてを展開したいけど
なして?
#!/bin/bash
for i in $*
do
7za x $i
done

$ ./7za.sh '*.7z'
Incorrect command line

526 :login:Penguin:2007/02/12(月) 13:38:29 ID:CD7jXCIx
シングルクオートで括ってるから?

527 :login:Penguin:2007/02/12(月) 22:43:07 ID:fALdmZ2l
だな

528 :login:Penguin:2007/02/14(水) 21:07:43 ID:kfyu3aZW
シェルスクリプトの練習のために、ftpでrsyncの様な事をする(つもりの)ものを書いてみました。
添削、助言などいただけると嬉しいです。定数定義等は省略してあります。

SERVER_FILE_LIST=$( ftp -n "${SERVER_ADRESS}" << END 2>>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
ls -l
END
)

SERVER_FILE_LIST=$(echo "${SERVER_FILE_LIST}"| awk '{print $9}')
UPFILE_LIST=$( ls -1 |sed "/^${LOGFILE_NAME}$/d" )

for SERVER_FILE in ${SERVER_FILE_LIST}
do
UPFILE_LIST=$(echo "${UPFILE_LIST}" |sed "/^${SERVER_FILE}$/d" )
done

for UPFILE in ${UPFILE_LIST}
do
ftp -i -v -n ${SERVER_ADRESS} << END >>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
bin
put ${UPFILE}
quit
END
done

529 :login:Penguin:2007/02/14(水) 21:48:24 ID:/I11T7H/
じゃあ俺も。ようつべからflvを拾ってくるスクリプト(要wget)。
パラメータは http://www.youtube.com/watch?v=XxXxXxXxXxX みたいなのをつける

#!/bin/sh
if [ "$1" = "" ] ; then exit 1 ; fi
YTURL=`echo $1|grep http://www.youtube.com/watch`
if [ -z $YTURL ] ; then exit 1 ; fi
VIDEOID=`echo $YTURL | cut -d = -f 2`
if [ -z $VIDEOID ] ; then exit 1 ; fi
INDEX=`mktemp YouTube.XXXXXXXX`
wget -q "$YTURL" -O $INDEX
if [ -s $INDEX ] ; then
YTURL=`grep "/player2.swf?" $INDEX | \
cut -d \" -f 2 | \
cut -d ? -f 2 `
wget "http://www.youtube.com/get_video?$YTURL" -O $VIDEOID.flv
fi
rm -f $INDEX

530 :login:Penguin:2007/02/15(木) 04:53:05 ID:Hg/Fwxgo
>>529
youtube-dl便利だぞ

531 :login:Penguin:2007/02/15(木) 08:15:32 ID:gox/9ooE
ようつべよりぐぐるの動画を……

532 :login:Penguin:2007/02/15(木) 08:20:07 ID:gox/9ooE
なんかちょっとgoogleっぽいIDが出た。

533 :login:Penguin:2007/02/15(木) 10:12:16 ID:IJ3FcxR6
GUIが好きならDemocracyPlayerオススメ。

534 :528:2007/02/15(木) 12:45:31 ID:w0BybIhd
タイムスタンプファイルサイズも比較しないレベルの低いのはヌルーっすかwww

変なことは書いていないと肯定的に考えるべきか…

535 :login:Penguin:2007/02/15(木) 13:24:50 ID:LfPH5BoW
つーか読むのめんどい。
多少汚くても
自分がやりたいことが実現できてるなら
それでいいんじゃね?
どっかわからない・うまく動かないとこがあるなら言ってよ。

536 :528:2007/02/15(木) 14:19:37 ID:w0BybIhd
>>535
それはそうですね。一応、使えてるのでOKかも。
mputがうまくいかなかった理由(ファイル名を”で囲う)がわかったのでforも一個減らせたし。
さて次はタイプスタンプでも取得するか。

537 :login:Penguin:2007/02/15(木) 14:59:35 ID:1HhpQr6V
du -a /usr/local/bin | gawk '{printf "%s\n", $0}'

コマンドラインから 動作。

ファイルに書いて、ファイルを実行すると gawkで
gawk: cmd. line:1: {printf "%s\n", $0}
' in expression:1: ^ invalid char '

エロ意人おしえてください

538 :528:2007/02/15(木) 15:06:03 ID:w0BybIhd
>>537
エロくない人だけど動きましたよ

539 :login:Penguin:2007/02/15(木) 15:28:35 ID:ooDXnCch
printf("%s\n",$0) にしてみるとか

540 :login:Penguin:2007/02/15(木) 15:49:24 ID:1HhpQr6V
>>538
>>539
レスさんきゅ。

gawk: cmd. line:1: printf ("%s\n", $0)
' in expression:1:             ^ invalid char '

いやぁ、動作しないのがおかしいんだけどね・・・。
おかしいなぁ。

いい忘れたが
元はといえば、Solaris HPで動作したシェルスクリプトがまったく動作しない。

ソラリス、HP:OK

CentOS4.4:NG

541 :540:2007/02/15(木) 16:24:13 ID:1HhpQr6V
自分のCentOS4.4では 動作しないが
実際動作させる環境(RHEL)で動作したから、クローズです。

gawk awkが違うってことだな。

542 :login:Penguin:2007/02/15(木) 16:49:04 ID:zT9bgmHM
たぶん改行コードが腐ってる。awk のせいではない。


543 :login:Penguin:2007/02/15(木) 21:15:18 ID:gox/9ooE
シェルが腐ってて''の中の\nを解釈しちゃうのかね。

544 :login:Penguin:2007/02/16(金) 09:20:41 ID:+PZTEw3U
違う。改行コードが CR+LF になっているので、awk の引数が
{....} ではなく {.....}CR になって構文エラーになる。


545 :login:Penguin:2007/02/16(金) 22:12:22 ID:/EU/hyDk
YouTubeとかGreasemonkeyで良いじゃんって思うんだけど
w3mで見れないし

546 :login:Penguin:2007/02/22(木) 00:04:52 ID:8/cpZrIn
初めてのシェルスクリプトです。自信ないけど見てください。
mktempで作成した一時ファイルは削除した方がいいのでしょうか。エラー処理とかよくわかりません。

使用例
echo 'http://shupoxxx.2.dtiblog.com/?page=0' | ./urlcollector.sh '/\?page=[0-2]' | grep 'jpg$'

#!/bin/sh
# urlcollector.sh
REGEX=$1
TMPFILE=`mktemp /tmp/urlcollector.sh.XXXXXX`
DL_FILE=`mktemp /tmp/urlcollector.sh.XXXXXX`

download() {
    while read LINE; do
        if grep `echo "$LINE" | sed -e 's/?/\\\\?/'` $DL_FILE; then
            :
        else
            echo "DEBUG:$LINE" 1>&2
            echo "$LINE" >> $DL_FILE
            lynx -dump -image_links "$LINE" | grep -o 'http://.*$' |
            tee -a $TMPFILE | grep -E "$REGEX" | download
        fi
    done
}
download # let's do it!
cat $TMPFILE | sort -u

547 :login:Penguin:2007/02/22(木) 01:32:51 ID:I6i5DnCh
エラー処理は

 set -e
 trap '...終了時の掃除処理...' 0 1 2 3 14 15

あたりを冒頭にかくよろし。

548 :login:Penguin:2007/02/22(木) 10:19:06 ID:PGB0Kf4J
>>547
urlcollector.sh: line 1: ...終了時の掃除処理...: command not found

trap 'echo ...終了時の掃除処理...' 0 1 2 3 14 15



549 :login:Penguin:2007/02/22(木) 17:37:30 ID:IB5Lfolq
>>546
それだと相対パスのリンク取れないけどそれでいいならいいか。
俺なら手抜きでこうやる。

URL=http://hogehoge.jp

wget -nv -nd -r -w1 --delete-after $URL 2>&1 | awk '{sub("^URL:","",$2); print $2;}'



550 :login:Penguin:2007/02/28(水) 03:56:45 ID:KugGv7KW
if文で「(AかつB)またはC」を条件にしたい時
if [ ( A -a B ) -o C ] という構文は
解釈してくれないようなのですが、どのように
表現したらいいのでしょうか?
とりあえず
if [ A -a B ] ; then
...
elif [ C ] ; then
...(同じコマンド)
としているのですが・・・。


551 :login:Penguin:2007/02/28(水) 07:40:43 ID:gjXTuKQD
>>550
if [ A -o C ]; then
if [ B -o C ]; then
...
fi
fi

552 :login:Penguin:2007/02/28(水) 10:06:56 ID:J/P3bKEE
>>550
解釈する。

ただし、ほとんど全てのシェルで括弧はサブシェルを意味するから、
if [ \( A -a B \) -o C ]; then
と書く必要があるよねえ。

160 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)