1 名前:名無しさん@お腹いっぱい。 mailto:sageteoff [2015/08/14(金) 23:42:01.51 .net] シェルスクリプトの総合スレです。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆーな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 □回答者への注意事項: ・シェルスクリプトでの処理方法を質問しているのに、よくわからずに 「そういうのはperl使いましょう」と回答するのはやめましょう。 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。 前スレ シェルスクリプト総合 その24 peace.2ch.net/test/read.cgi/unix/1415634843/
2 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:42:43.85 .net] シェルスクリプトの総合スレです。 初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずはテンプレートをご覧下さい。 □A. お約束 1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、 Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。 bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。 良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。 2. 質問する前に、まず自分で調べましょう。ただし、 「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。 3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。 4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は 控えましょう。 □B. お約束の補足 1. Mac OS X では、/bin/sh の実体は bash です。また、一般的に BSD 系 や GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。 ls -l /bin/sh や readlink -e /bin/sh で確かめて下さい。 2. 可搬性については、下記 F.1 を参照して下さい。 3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities ) を参照して下さい。 4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に 小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 ) 5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、 SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。 SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。 ( 下記 F.3 参照 )
3 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:44:39.30 .net] □C. 初心者へのアドバイス 1. シェルスクリプトのことをシェルってゆーな 2. 知らないコマンドが出てきたら man コマンドで調べましょう。 3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。 apropos ないしは man -k でそれらしい単語による簡単な検索もできます。 4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。 5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。 6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が 適した処理にはそちらを使いましょう。 7. シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題は正規表現スレへ 8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照 www.speech-lab.org/~hiroki/csh-whynot.euc 9. cat file|すんなハゲ a. 詳細は "Useless Use of Cat" UUOC で検索して下さい b. 有用な場合も有ります Useful use of cat(1) 英文 www.in-ulm.de/~mascheck/various/uuoc/ □D. シェルスクリプトでよく使うコマンド 1. 制御・条件判定系: [, test, expr, true, false, yes, getopts 2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut, paste, comm, join 3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、 find は -exec command {} + を推奨。 他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 ) 4. ディレクトリ系: basename, dirname 5. 出力系: echo, printf 6. 対話コマンド制御系: expect 7. http / ftp の処理自動化: wget, curl
4 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:50:19.57 .net] □E. 学習用テキスト 1. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/ (↑サイト消滅かも) ayapin.film.s.dendai.ac.jp/~matuda/Lecture/PDF/sh-two.pdf 2. UNIX FAQ LIST www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html (3. シェルを使おう - 導入からプログラミングまで - ( 2002年 ) www.netfort.gr.jp/~tomokuni/lms/shell/ (リンク切れ)) □F. 参考リンク 1. 可搬性関連 a. autoconf マニュアル 移植性のあるシェルプログラム www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell www.geocities.jp/fut_nis/html/autoconf-ja/Portable-Shell.html b. Portability talk [Bash Hackers Wiki] 英文 Obsolete and deprecated syntax も見る価値有り wiki.bash-hackers.org/scripting/nonportable c. How to make bash scripts work in dash 英文 mywiki.wooledge.org/Bashism d. DashAsBinSh 英文 https://wiki.ubuntu.com/DashAsBinSh e. Portable Shell Programming 英文 www.in-ulm.de/~mascheck/various/portability/
5 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:53:33.73 .net] 2. POSIX The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition 英文 pubs.opengroup.org/onlinepubs/9699919799/ 3. Traditional Bourne Shell 関連 a. The Traditional Bourne Shell Family History and Development 英文 www.in-ulm.de/~mascheck/bourne/ b. BourneShell / Where does the Bourne shell live? 英文 mywiki.wooledge.org/BourneShell c. The Heirloom Bourne Shell 英文 heirloom.sourceforge.net/ 4. マニュアル a. The Base Specifications Issue 7, 2013 Edition 英文 pubs.opengroup.org/onlinepubs/9699919799/nfindex.html b. FreeBSD 日本語マニュアル検索 www.jp.freebsd.org/man-jp/search.html c. JM Project (Japanese) linuxjm.sourceforge.jp/ 5. FAQ 等 a. UNIXの部屋 ( 2011年 ) x68000.q-e-d.net/~68user/unix/ b. Linux JF (Japanese FAQ) Project linuxjf.osdn.jp/ c. Advanced Bash-Scripting Guide 英文 www.tldp.org/LDP/abs/html/ d. Unix Programming FAQ 日本語訳 ( 2000年 ) www.race.u-tokyo.ac.jp/~moro/unix-programmer/
6 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:56:30.37 .net] 6. ツール a. web tool です。Vim syntastic や Emacs の Flycheck でも使えます ShellCheck www.shellcheck.net/about.html b. vim 用 syntastic https://github.com/scrooloose/syntastic c. checkbashisms も使用してチェック duggan/shlint GitHub https://github.com/duggan/shlint □G. 前スレ 1. ☆シェルスクリプトを勉強するにあたって☆ hibari.2ch.net/test/read.cgi/unix/989659936/ 2. 便利なシェルスクリプト見せろ pc.2ch.net/test/read.cgi/unix/996949546/ 3. シェルスクリプト総合 その1 pc5.2ch.net/test/read.cgi/unix/1101820646/ 後略。検索して下さい
7 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/14(金) 23:57:59.64
] [ここ壊れてます]
8 名前: .net mailto: □H. 関連スレ(UNIX板/プログラム板) 1. sed http://peace.2ch.net/test/read.cgi/unix/1085730992/ 2. 正規表現 http://peace.2ch.net/test/read.cgi/unix/1039165754/ 3. Regular Expression(正規表現) Part13 http://peace.2ch.net/test/read.cgi/tech/1415149975/ 4.Perlについての質問箱 64箱目 [転載禁止](c)2ch.net http://peace.2ch.net/test/read.cgi/tech/1417291896/ 5. ECMAScript デス 4 http://peace.2ch.net/test/read.cgi/tech/1325448978/ 6. Ruby 初心者スレッド Part 57©2ch.net [転載禁止](c)2ch.net http://peace.2ch.net/test/read.cgi/tech/1426165733/ 7. Pythonのお勉強 Part50 http://peace.2ch.net/test/read.cgi/tech/1413474092/ 8. 【node.js】サーバサイドjavascript 3【io.js】(c)2ch.net http://peace.2ch.net/test/read.cgi/tech/1419673207/ □I. 現在評価待ち: X.n は予定した追加先。主にスレ立て人の判断保留用。 [] [ここ壊れてます]
9 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/15(土) 00:04:34.32 .net] テンプレは以上です。 漏れや要求があれば各自追記願います。
10 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/15(土) 03:33:33.31 .net] Windows用のはないの?
11 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/15(土) 13:42:11.47 .net] Windows用の何?
12 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/15(土) 14:41:40.48 .net] bashとかTraditional Bourne Shellとか。
13 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/15(土) 17:47:20.99 .net] Cygwin入れれば
14 名前:名無しさん@お腹いっぱい。 [2015/08/16(日) 00:14:04.65 .net] ping使うやつが移植性無くなるな
15 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/16(日) 21:47:33.05 .net] テキストファイルの分割で教えてください 例えば95行のテキストファイルを10分割するとき、 splitだと10行のファイルが9個と5行のファイルが1個できますが そういう分割ではなく、10行のファイルを5個、9行のファイルを5個、 というように、等分に近くなるように分割したいです 今はforループで、1行目はファイル1に、2行目はファイル2に、 途中略して10行目はファイル10に、そして11行目はファイル1に、 みたいに仕分けてるのですが、splitの様にファイル先頭からの並び通りに 等分したく思ってます
16 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/16(日) 22:42:11.52 .net] すればいいじゃん。
17 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/16(日) 23:56:46.15 .net] >>14 awk で行番号見ながら出力ファイルを変えれば? 以下は out.0〜9 に出力する例。 動かしてみた感じだと perl で真面目にプログラム書いた方が処理速度的には速そうね。 #!/bin/sh INFILE="$1" LINE=$(wc -l < "$INFILE") SPMOD=$(expr $LINE % 10) SPDIV=$(expr $LINE / 10) [ "$SPMOD" != 0 ] && SPDIV=$(expr $SPDIV + 1) awk "BEGIN{I=0; F=\"out.\"I; DIV=${SPDIV}; B=DIV;} {print \$0 > F; if(NR == B){I++; if(I==${SPMOD}){DIV--;} F=\"out.\"I; B+=DIV;}}" "$INFILE"
18 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/17(月) 00:28:08.28 .net] GNU coreutils の split コマンドだと -n オプションってのがある。 $ split -n l/10 95lines.txt # 1/10 じゃなくて l/10 ね(line の l) ただ、こうなる↓ $ wc -l xa? 12 xaa 9 xab 9 xac 9 xad 9 xae 9 xaf 9 xag 9 xah 9 xai 11 xaj 95 合計
19 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/17(月) 07:22:58.29 .net] >>16 なるほど まずは処理内容を勉強して、考えます >>17 なんか微妙な分け方ですね… GNU版の採用や、96とか97とかになったらどうなるかとか、調べてみます
20 名前:名無しさん@お腹いっぱい。 [2015/08/23(日) 21:52:42.48 .net] ubuntuです。超初歩の段階なのですが for file in ${1}/* do echo "${file}" done 上記のコードで $sh test.sh ~/Desktop/foo とすると期待通りに /home/hoge/Desktop/foo/a /home/hoge/Desktop/foo/b /home/hoge/Desktop/foo/c と表示されるのですが $sh test.sh "~/Desktop/foo" とダブルクォートでくくると ~/Desktop/foo/* と表示されてしまいます でも空白の入ったパスを渡したいときはダブルクォートでくくらないといけませんよね?どうすればいいですか ${1}/*を"${1}/*"としても"${1}"/*としてもうまくいきませんでした
21 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/23(日) 22:25:01.69 .net] >>19 チルダがクォートされているかどうかで違う $ echo ~/Desktop/foo /home/hoge/Desktop/foo $ echo "~/Desktop/foo" ~/Desktop/foo
22 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/23(日) 22:53:07.70 .net] >>19 $ sh test.sh "${HOME}/Desktop/foo"
23 名前:19 mailto:sage [2015/08/23(日) 23:32:18.17 .net] >>20-21 レスどうもありがとうございます コード側の問題じゃなくて渡す側の書き方に問題があったんですね 空白を含んでいないパスは期待どおりになりました が空白を含んでいる場合はやっぱり「*」が展開されずに $ sh test.sh "/home/hoge/Desktop/foo bar" または $ sh test.sh "${HOME}/Desktop/foo bar" とすると /home/hoge/Desktop/foo bar/* と表示されてしまいます
24 名前:19 mailto:sage [2015/08/23(日) 23:37:21.98 .net] すみません ${1}/* と "${1}/*" はだめでしたが "${1}"/* としたらうまくいきました ダブルクォートって難しいです
25 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/24(月) 04:09:11.65 .net] ${1}/ 中のファイルに空白を含むファイル名があるとダメ /home/hoge/Desktop/foo bar/space ship.txt があると /home/hoge/Desktop/foo bar/space ship.txt と2行に渡って表示される
26 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 09:55:00.50 .net] そうでもないよ $ cat test.sh #!/bin/sh for f in "$1"/* do echo "$f" done $ touch "space ship.txt" $ sh test.sh . ./space ship.txt ./test.sh
27 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 11:38:42.71 .net] >>24 、>>25 と同様そうでもない 対象ディレクトリと対象ディレクトリ内のファイル名の両方にスペースが含まれて いても問題ない あと、ソースに渡された引数+"/*"がどう展開されるかの表示を追加 bash-2.05$ cat test.sh #!/bin/sh echo -n "arg/* = '" echo -n "${1}"/* echo "'" echo for file in "${1}"/* do echo "${file}" done exit 0
28 名前:26 mailto:sage [2015/08/25(火) 11:40:11.64 .net] bash-2.05$ mkdir "foo bar" bash-2.05$ cd "foo bar" bash-2.05$ touch "space ship.txt" bash-2.05$ touch space_ship.txt bash-2.05$ cd .. bash-2.05$ tree `-+ . +-- foo bar | +-- space ship.txt | +-- space_ship.txt +-- test.sh 1 directory 3 files bash-2.05$ sh test.sh "foo bar" arg/* = 'foo bar/space ship.txt foo bar/space_ship.txt' foo bar/space ship.txt foo bar/space_ship.txt bash-2.05$
29 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 12:23:17.60 .net] >>25 >>24 が駄目と言ってるのは ${1} の場合の話だろw "$1"ならもちろん問題ないよ。
30 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 12:29:22.17 .net] bash-2.05 とか古いの使うにも程がある。劣度法度9か何かか?
31 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 12:55:51.30 .net] >>28 いや…ファイルの話だよね?割りとどうでもいい流れだけど一応 $ cat test.sh #!/bin/sh for f in ${1}/* do echo "$f" done $ ls space ship.txt test.sh $ sh test.sh . ./space ship.txt ./test.sh $
32 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 13:12:03.64 .net] 話を理解していない人々が多過ぎる。スルーしよw
33 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 13:14:16.88 .net] >>30 その場合、 ${1} に . が代入されるから問題が起きてないだけ。 ${1} とか半端な記述せずに "$1"にすること。${1}ってクォートなしの $1 と同じだから。
34 名前:26 mailto:sage [2015/08/25(火) 13:25:30.87 .net] 「"${1}"」ではなくて「${1}」という記述にこだわるならファイル名にスペースが 含まれる場合の常套手段で「IFS」を「改行コード」のみに設定すればOK bash-2.05$ cat test.sh #!/bin/sh IFS_BACKUP=$IFS IFS=
35 名前:" " echo -n "arg/* = '" echo -n "${1}"/* echo "'" echo for file in ${1}/* do echo "${file}" done IFS=$IFS_BACKUP exit 0 [] [ここ壊れてます]
36 名前:33 mailto:sage [2015/08/25(火) 13:26:35.02 .net] 【続き】 bash-2.05$ tree `-+ . +-- foo bar | +-- space ship.txt | +-- space_ship.txt +-- test.sh 1 directory 3 files bash-2.05$ sh test.sh "foo bar" arg/* = 'foo bar/space ship.txt foo bar/space_ship.txt' foo bar/space ship.txt foo bar/space_ship.txt bash-2.05$
37 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 13:30:12.68 .net] >>26 それは改行コード入りファイル名があるからNG
38 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/25(火) 13:58:06.49 .net] このスレの住人にとっては当たり前過ぎる基本的初歩的なことをわざわざ多くの行数使って書き込まれてもなぁ
39 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/08/30(日) 12:52:52.88 .net] >>13 最近cygwin使ってないんで試してないけど 神が現れてsudo実装してping打てるようになった模様 詳細はcygwinスレ参照 そうそうcygwinのpingって何か違ったんだっけ?
40 名前:名無しさん@お腹いっぱい。 [2015/09/06(日) 16:40:59.13 .net] 引数 $1 が function の中から参照できない 標準では全部グローバルのスコープじゃなかったのか? グローバル変数に引数をコピーするとグローバル変数は参照できるけど 引数はそういうものなのか? ~/ cat bug.sh function bug_version { echo "argument $1 can't handle in function" } bug_version echo "argument $1 can handle out of function" ~/ sh bug.sh arg argument can't handle in function argument arg can handle out of function
41 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/06(日) 17:58:01.08 .net] >>38 > 引数 $1 が function の中から参照できない > 標準では全部グローバルのスコープじゃなかったのか? 【ポイント】 シェル関数内の位置パラメータと特殊パラメータ「$#」はシェル関数内のみで有効 【説明】 シェル関数の実行には『引数』を付けることができ、シェル関数内の位置パラメ ータと特殊パラペータ「$#」は、一時的にシェル関数の『引数』とその個数で置 き換えられる。このため、位置パラメーターと特殊パラペータ$#はシェル関数内 のみで有効。 あと、shの場合「function」は使えない、またシェル関数名の後ろに「()」がないと syntax error $ cat bug.sh【修正版】 bug_version() { ← shの場合「function」は使えない、シェル関数名の後ろに「()」がないとダメ echo "argument $1 can't handle in function" } bug_version $1 ← シェル関数に引数として渡した例 echo "argument $1 can handle out of function" $ sh bug.sh argument arg can't handle in function argument arg can handle out of function
42 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/06(日) 17:59:13.35 .net] 引数はそういうものです bug_versionを引数無しで呼び出してるので$1には何も設定されません
43 名前:39 mailto:sage [2015/09/06(日) 18:00:18.46 .net] 【訂正】 $ sh bug.sh arg argument arg can't handle in function argument arg can handle out of function
44 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/06(日) 19:34:01.02 .net] >>38 まぁ Linux 限定だけど、 function bug_version { echo "argument $(cat /proc/$$/cmdline | xargs -n1 -0 | sed -n 3p) can handle in function" } なんてするといいかも
45 名前:名無しさん@お腹いっぱい。 [2015/09/06(日) 19:39:35.79 .net] 愚かにも引数忘れてた みんなありがとう コードが綺麗になった
46 名前:名無しさん@お腹いっぱい。 [2015/09/09(水) 19:11:24.39 .net] 質問です。 grep "aaa\|bbb" はokなのに、grep "aaa\&bbb" はなぜ だめなんでしょう?
47 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/09(水) 20:10:57.27 .net] >>44 どちらも仕様どおりに正しく動く 何をもってダメという?
48 名前:名無しさん@お腹いっぱい。 [2015/09/09(水) 20:21:28.99 .net] >>45 私の環境ではこうなります。 $ echo "aaa bbb" | grep "aaa\|bbb"; echo $? aaa bbb ccc 0 $ echo "aaa bbb" | grep "aaa\&bbb"; echo $? 1
49 名前:名無しさん@お腹いっぱい。 [2015/09/09(水) 20:25:36.29 .net] >>45 あれれ、「 ccc」入っちゃった。無視してくださいw
50 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/09(水) 20:50:24.67 .net] >>46 だからそれは仕様どおり
51 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/09(水) 20:54:06.69 .net] \|には特別な意味があるけど\&にはないんだよ 単に&と書いたのと同じ
52 名前:39、41 mailto:sage [2015/09/10(木) 02:49:03.69 .net] >>44 、>>46 ひょっとすると[grep]コマンドによる『AND検索』の方法(記述)を 『grep "aaa\&bbb"』だと勘違いしていない? [grep]コマンドによる『AND検索』には『OR検索』のような正規表現による 記述方法『grep "aaa\|bbb"』は存在しないので、つぎの例のように地道 にパイプで繋ぐしかないけど [grep]コマンドによる『AND検索』の方法 $ echo "aaa bbb" | grep "aaa" | grep "bbb" ; echo $? aaa bbb 0 $ echo "aaa ccc" | grep "aaa" | grep "bbb" ; echo $? # マッチしないデータ「aaa ccc」の例 1 $ あと、>>44 、>>46 って >>38 と同じ人?
53 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/10(木) 07:50:58.43 .net] $ grep -E 'aaa.*bbb|bbb.*aaa' か、GNU grep なら $ grep -P '(?=.*aaa)(?=.*bbb)' でもOK。
54 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/10(木) 07:56:54.38 .net] awk 使え awk '/aaa/&&/bbb/'
55 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/10(木) 17:51:40.81 .net] \& なんてどこに書いてあったの
56 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/24(木) 23:16:07.36 .net] 宣伝 【POSIX】UNIXプログラミング【BSD】 [転載禁止]©2ch.net peace.2ch.net/test/read.cgi/unix/1443103705/
57 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/27(日) 16:29:45.68 .net] こんな風なテキストファイルlog.txtがあります %PART_A% a11 a12 13 a21 a21 a23 a31 a32 a33 %PART_B% b11 b12 b13 b14 b21 b22 b23 b24 b31 b32 b33 b24 このように%PART_x%(実はxはAとBがランダムに登場)で区切られながら 数行ずつ出力されているテキストを、値だけ(a11〜b24まで)、5列で左詰めの CSV形式に整形するために、こんなスクリプトを作りました(ほとんどawkですが・・・) #!/bin/sh cat log.txt | awk 'BEGIN{FLG=0} /%PART_A%/{FLG=1; getline} /%PART_B%/{FLG=2; getline} {if (FLG==1) {print $1","$2","$3",0,0"} else if (FLG==2) {print $1","$2","$3","$4",0"} }' 期待通り動いてはいるのですが、フラグやgetline周りが、なんか力技?っぽくて 改善の余地があるように思ってます このような処理をawkで書くときって、どのように書くとよいのでしょう
58 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/27(日) 16:38:38.08 .net] 力技でも動いているならそれでいいんじゃない? この間、似たような事を業務でやったけど考えるの面倒だったから pasteコマンドでひとつのファイルにして、特定フィールドを読み込む方法にした。 なにぶん、思想が古い年代なもんで複数ファイルを 同時に読み込んであーだこーだするのはCで書きたくなる。
59 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/27(日) 17:34:07.98 .net] きれいでも動かないコードより きたなくてもちゃんと動作するコードの方がよい そんな格言なかったっけ?
60 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/27(日) 19:24:41.10 .net] 要求仕様通りに動くことが大前提ですな。 コードの可読性を語るとキリが無い。 シェルスクリプトで訳が判らなくなる書き方する人いるけど、ある意味才能としか思えない。
61 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/09/28(月) 01:10:28.27 .net] 過疎ってるけど awkについて語るスレ $2 peace.2ch.net/test/read.cgi/tech/1172242542/ もありますよ。a11からb24が全部数値で3つまでは確実に値が入ってるなら awk 'BEGIN{OFS=","};!~/%/{print $1,$2,$3,$4+0,0}' で済む気がするけど。
62 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/04(日) 19:58:15.31 .net] >>57 きれいでも動かないコードより きたなくてもちゃんと動作するコードの方がよい そして、きれいでちゃんと動作するコードが 一番いいのは言うまでもない。
63 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/04(日) 22:53:55.31 .net] 正規表現で書くとどうなるんだ?
64 名前:名無しさん@お腹いっぱい。 [2015/10/06(火) 13:14:00.89 .net] getline回りはsplitで"^(?=\%PART_)"で区切れると楽 下のコードは "^(?=\d)"にするとレス番号だけが行頭で表示され 本文はインデントされる2chですら処理できる #!/usr/bin/env perl use strict; use warnings; use utf8; my $enc = 'UTF-8'; my ($delimiter, $search); $delimiter = "^(?=\%PART_)" GetOp
65 名前:tions ('delimiter|d=s' => \$delimiter, 'search|s=s'=> \$search); my $line = join('', <>); my @lines = split /$delimiter/m, $line; for (@lines) {print if /$search/;} [] [ここ壊れてます]
66 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/13(火) 12:01:58.60 .net] ワイルドカードて全角も扱えるんだね 勝手に半角のみと思い込んでた 自分用メモ ひらがな: [ぁ-ん] 全角カタカナ: [ァ-ヾ] 半角カタカナ: [ヲ-゚] 全てのカタカナ: [ァ-ヾヲ-゚] 全角数字: [0-9] 全角英字: [a-zA-Z] 全角英数字: [0-z] 全角文字(英数字以外, ひらがな, カタカナ, 漢字, 記号): [、-鶴] 全角文字(英数字, ひらがな, カタカナ, 漢字, 記号): [、-鶴0-9a-zA-Z] 漢字: [一-鶴]
67 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/13(火) 23:33:25.92 .net] [ぁ-ん]と[ん-ぁ]で ・同じ結果→POSIX準拠 ・結果が異なる→準拠してない というのも豆
68 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/15(木) 01:00:25.45 .net] \p{Hiragana}
69 名前:名無しさん@お腹いっぱい。 [2015/10/16(金) 00:12:27.12 .net] 第一感その手のものを使って保守性ケアするよな
70 名前:名無しさん@お腹いっぱい。 [2015/10/16(金) 13:16:19.20 .net] 任意のキーボード・ショートカットを突然入力すると、任意のスクリプトを実行するような技はありますか。 例えば、特定のアプリケーションをアクティブにするスクリプトを書いたとして、それを Ctrl+Alt+Gで実行してGoogleChromeをアクティブにするとか、そういう事です。 Alt+Tabで一つ一つ切り替えるのはうんざりなんですよね。 スクリプト自体はできてるんですが、それをショートカットと結びつける技が分かりません。
71 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/16(金) 13:35:52.55 .net] WMとかDEの機能使った方がいいんじゃね シェルスクリプトの話ではない
72 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/16(金) 13:41:08.99 .net] 「linux キーボードショートカット カスタマイズ」でぐぐれ /apps/metacity/global_keybindings/panel_run_dialogとかって情報はすぐ出てくる
73 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/16(金) 16:30:40.14 .net] キーバインド割り当てかaliasを作るかじゃない?
74 名前:名無しさん@お腹いっぱい。 [2015/10/18(日) 03:08:01.82 .net] だな w3mなら .w3m/keymap xmonadなら .xmonad/xmonad.hs に書くような内容
75 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/18(日) 03:29:42.19 .net] busyboxでunicode変換ってどうする?
76 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/19(月) 12:52:16.45 .net] busybox sh に限らず、iconv とかuconvとか入れて使うんじゃない?
77 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/19(月) 14:00:50.57 .net] すみませんが詳しい方のみ回答をお願いします
78 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/19(月) 14:28:46.62 .net] unicodeの何を?何へ?何から?変換するのかもうちょっと具体的に書かないと応える気にならない
79 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/19(月) 15:27:19.76 .net] 詳しくないのはどっちだよ そんなんだから周囲に教えてくれる人が居なくて 2chで質問するハメになるんだよ
80 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/20(火) 00:06:45.98 .net] 只のコピペの別人にキレてどうするよ。 わざわざbusybox縛りを入れて珍回答を期待してるのに普通の方法を答えるのもまあ2chらしいが。 っていうかnkfじゃないのな。
81 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/20(火) 07:22:32.22 .net] 以下のようなテキストファイルがあるとして (記載のアルファベットは例であり数字だったりマルチバイト文字だったりします) AAAAAAAAA BBBB CCCCCCCCCC DDDDDDDDDDD EEEEEEEEEEE 各1行を2行に増やすことってできますか? AAAAAAAAA AAAAAAAAA BBBB BBBB CCCCCCCCCC CCCCCCCCCC DDDDDDDDDDD DDDDDDDDDDD EEEEEEEEEEE EEEEEEEEEEE ループで1行ずつ読んで2行にして出力するくらいしか思いつかなかったのですが パイプを使ってシンプルにできたりしませんか?
82 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/20(火) 07:41:49.44 .net] >>78 sed p foo.txt
83 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/20(火) 21:45:48.66 .net] >>79 ありがとうございます こんなに簡単にできちゃった・・・ とりあえずpコマンド調べてみて 変換しない指定で返還前と変換後の2行が出力されるからこうなると理解しました
84 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/20(火) 23:06:19.80 .net] coolだよね
85 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 00:43:12.91 .net] >>78 を元に戻す方法は?
86 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 00:49:57.21 .net] uniq
87 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 01:33:11.68 .net] 4行並んだら破綻
88 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 01:46:20.53 .net] awk NR%2
89 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 01:56:17.21 .net] あえてsedで sed 'N; s/.*\n//'
90 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 06:13:41.20 .net] GNU sed 限定 sed -n 1~2p
91 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 06:38:20.24 .net] sed 'n;d' だけでいいのにw
92 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/21(水) 07:02:03.89 .net] 尊い
93 名前:名無しさん@お腹いっぱい。 [2015/10/22(木) 08:26:25.71 .net] そうだな 現代でも使える場面のあるsedは凄い
94 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/22(木) 12:24:50.15 .net] sedでutfの変換テーブル書いたらどの位の速度で動くものだろうか?
95 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/22(木) 14:32:56.99 .net] pdfファイルやExcelファイルを文字検索したいのですが スマートな方法はありませんか? ファイル変換しないといけないでしょうか?
96 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/22(木) 15:27:18.78 .net] 変換しないとだめです pdftotext あたりで標準出力に吐かせて grep とか
97 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/22(木) 15:55:01.58 .net] こんな感じになりました pdftotext hoge.pdf - | grep aaa pdftotextでググったらこのページが ttp://www.clear-code.com/blog/2010/8/2.html Excelはssconvertを使えばいいようですね
98 名前:名無しさん@お腹いっぱい。 [2015/10/22(木) 22:52:20.38 .net] ☆ 日本の核武装は早急に必須ですわ。☆ 総務省の『憲法改正国民投票法』、でググってみてください。 日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、日本人の悲願である 改憲の成就が決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。
99 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/27(火) 08:43:35.49 .net] cat file|した方がいいことも有るぞハゲ ってことかな? 大きなテキストファイルをawkで処理するときにcatで投げ込むのと、ファイル読み込みするのどっちが速いか比較 - カメニッキ tapira.hatenablog.com/entry/2015/07/22/214419 大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog d.hatena.ne.jp/yohei-a/20150728/1438099752
100 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/27(火) 09:02:14.04 .net] >>96 それって Linux OS でマルチコアで出力先が SSD の場合にだけ 速くなるかもしれないってオチだったような
101 名前:名無しさん@お腹いっぱい。 mailto:sage [2015/10/27(火) 11:16:32.98 .net] でも実際速くなったんでしょ?