1 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:54:23.25 .net] シェルスクリプトの総合スレです。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 ・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています 最新の仕様はこちらへ pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」 から参照することができます。) ・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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう 前スレ シェルスクリプト総合 その26 https://mevius.5ch.net/test/read.cgi/unix/1489979246/
46 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/09(水) 21:22:02.94 .net] $(( 3000 / 60 )) `expr 3000 / 60` 普通に算術で
47 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/09(水) 21:32:59.67 .net] date使ってもある意味無理やりなのは、 Linux date -d "@3000" +"%M" BSD date -r 3000 +%M >>44 は@が抜けてる
48 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/09(水) 21:34:52.98 .net] >>45 >>46 どうもありがとうございます!!
49 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/09(水) 22:11:38.47 .net] date -d "@3000" +"%M" これだと、59分以上を表せなかったです。
50 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 00:27:18.20 .net] まあ、算術コマンド使ったほうがいいわな。
51 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 00:34:52.62 .net] >>49 そうだね。 $ echo 3000/60 |bc 50 $ echo 4000/60 |bc 66
52 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 01:12:34.32 .net] だんだん数値が大きくなっていって閏年で悩むんだろうなあ
53 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 03:16:11.29 .net] dc -e '3000 60 / p'
54 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 16:08:46.44 .net] >>50 bcのマニュアル読もう! $ printf '%.0f\n' "$(echo '4000/60' | bc -l)" 67
55 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 16:49:23.89 .net] >>53 えっ、今回の要件は「商」を計算したいのだと思ったけど。 秒を分に変換するのに、勝手に四捨五入したらダメだろ
56 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 19:04:07.72 .net] 仕様が不明です
57 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/10(木) 20:04:02.04 .net] 好きに解釈して脱線レスを繋げるスレ
58 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 08:37:52.41 .net] すいません。 いま、誤ってログインシェルの設定ファイル(~/.bashrc)を空にしてしまいました。 しかし、まだログアウトしていないため、今稼動しているシェルはその設定を保持しています。 例えばエイリアスを知りたければ`alias`とやればいいはずですが、ほかにもシェル関数や環境変数なども読み込んでいます。 これらの値を今取得するにはどうすればいいですかね。
59 名前:名無しさん@お腹いっぱい。 [2018/05/17(木) 08:57:58.08 .net] >>57 set 環境変数とシェル関数(posixモードの場合は変数のみ) set -o オプション設定のon/off状態
60 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 08:58:54.79 .net] 変数はsetとかprintenv 関数知らん
61 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 10:41:31.20 .net] 関数はtypeで返ってくるんじゃない?
62 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 10:46:38.47 .net] 関数はsetで出てこね? printenvなんてあったのね。env使ってた。diffってみたが違いがわからんな。printenvの意味を後で調べてみよう
63 名前:57 mailto:sage [2018/05/17(木) 11:04:55.79 .net] みなさまありがとうございます。 set -oおよびprintenv(これはenvと同じ出力でした。なんとなくprintenvを使いました)でかなりの部分を取り戻すことができました。 ただ、set -oで出力されるオプション設定の項目数が少ないように思うんだけども、どうなんですかね。 allexport off braceexpand on emacs off errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi on xtrace off なお、これらの内allexportやxtraceなどは設定した覚えがありません。システム設定(/etc/bash.bashrcあたり)でも設定されてません。不思議です……。 厚かましいのですが、できれば全てのオプションの状態を把握したいです。
64 名前:57 mailto:sage [2018/05/17(木) 11:06:15.20 .net] すいません。shoptで行けました。ほとんど修復できました。感謝します。
65 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 13:23:11.51 .net] >>63 っていうか、バックアップから.bashrcを拾って戻せるようにしておきなよ 言われなくても百も承知だろうけど、バックアップは大事だよ
66 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 13:36:50.52 .net] >>64 ですよね……。 なぜかバックアップとシンボリックリンクを張るという馬鹿な真似をしてました。 それはもうバックアップとは言わねぇか。 次にパソコンを買った時はLVMやらで柔軟なパーティションを組んでやります
67 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 15:18:16.60 .net] ドットファイルみたいにちょくちょく書き換えしててなくなると困るファイルは RCSなんかで管理しとくといいんじゃない?
68 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 17:13:16.93 .net] RCSとか石器時代かよ
69 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 19:40:33.27 .net] SCCSですよね
70 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 19:43:19.47 .net] >>66 ホームぶっ飛ばしたバカを見たことがある。 多分 rm -fr ./work を rm -fr . /work って打ったんだろう。
71 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/17(木) 19:48:04.21 .net] rm -rfは本当に怖いな
72 名前:名無しさん@お腹いっぱい。 [2018/05/19(土) 07:42:41.44 .net] ★★★共産●主義者とは言葉の通じない赤犬であり、決して人間と見なしてはならない!時たま本当らしいことを言うとしても、それはより大きな嘘を覆い隠す為の罠である。★★★ ● この掲示板(万有サロン)に優秀な書き込みをして、総額148万円の賞金をゲット●しよう!(*^^)v jbbs.livedoor.jp/study/37 ●29/ →リンクが不良なら、検索窓に入れる!●
73 名前:名無しさん@お腹いっぱい。 [2018/05/21(月) 09:50:43.86 .net] /home直下にhoge00〜hoge99までの名前がついているディレクトリがあるとします 他にも/home直下にはディレクトリが存在します ディレクトリ名を検索しながら、hoge00-hoge99の名前にマッチした複数のディレクトリの中の、ある特定のディレクトリに既存のファイルであるtestという名前のファイルをコピーしたいです ある特定の、という意味は ・hoge○○ディレクトリ直下にtestというファイルがあったら→スルー ・testというファイル名のファイルがhoge○○直下になければ、既存のtestを該当hoge○○ディレクトリ直下にコピー このようなシェルスクリプトを書きたいのですが教えてください
74 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 09:55:33.18 .net] forで回してifで分岐してcpするだけだと思うけど、 自分ではどこまでできてんの?
75 名前:名無しさん@お腹いっぱい。 [2018/05/21(月) 10:02:06.88 .net] >>73 ifとcpは使うんだろうなと思っていました forもやはり必要そうですね、、
76 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:09:07.33 .net] それを使わずにどうやろうというんだ 要するに連番ディレクトリに全てtestファイルがあるようにしたい、ただし既存のtestファイルは上書きしない、でいいのか
77 名前:名無しさん@お腹いっぱい。 [2018/05/21(月) 10:10:59.07 .net] >>75 全くおっしゃる通りです
78 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:19:49.89 .net] filehoge="test" [ ! -f "$filehoge" ] exit 1 seq -f 'hoge%02g' 1 99 | while read hogedir do [ -d "$hogedir" ] && [ ! -f "$hogedir/$filehoge" ] && { cp "$filehoge" "$hogedir"; echo "copied into $hogedir"; } done
79 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:20:58.69 .net] seq -f 'hoge%02g' 0 99 の間違い。00からなので
80 名前:名無しさん@お腹いっぱい。 [2018/05/21(月) 10:25:03.40 .net] >>77 >>78 もの凄く高度ですね… 自分には理解できるかわかりませんがじっくり読ませてください ありがとうございます
81 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:38:02.84 .net] お題として遊ぶなら、findしてexec内でやっつけるとかかな
82 名前:72 [2018/05/21(月) 10:39:59.27 .net] 自分はfindを使うやり方を考えていました
83 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:42:46.03 .net] findは存在を確認するのは楽だろうけど、存在しないことを確認するのは面倒じゃない?
84 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:50:09.46 .net] >>77 [ ! -f "$filehoge" ] && exit 1 の間違いもあった。&&抜けてた、すまん。 >>79 ん?まあ、for(forはアレでアレの回避があったような気がするがすぐ忘れる。 | while read hoge しか使わないので) と if(明示するだけだけど)で書けばいいよ ... for hogedir in $(seq -f 'hoge%02g' 1 99) ... if [ -d "$hogedir" ] && [ ! -f "$hogedir/$filehoge" ]; then cp "$filehoge" "$hogedir" ... fi
85 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 10:57:49.03 .net] あー、" で括るだけか。アレの場合も for hogedir in "$(seq -f 'hoge%02g' 1 99)" が、よりかな
86 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 11:19:28.01 .net] やっぱりダメなのかな?? touch 'hoge 01';touch 'hoge$02' for name in "$(/bin/ls -1)" /bin/ls -1 | while read name やっぱforはメンドクサイから、安心簡単な while でいいやっ
87 名前:72 [2018/05/21(月) 12:04:38.46 .net] >>82 考えるのに役立つアドバイスありがとうございます >>83 >>84>>85 更新してくださりありがとうございますm(_ _)m 読ませていただきます
88 名前:72 [2018/05/21(月) 12:08:42.09 .net] 初心者ですが面白くなってきました 今日中に仕上げられるよう頑張ります
89 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 12:31:18.57 .net] 楽しめるうちにたくさん学習しておくんだぞ
90 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 15:08:37.35 .net] >>82 それはexecの中でやればいいんじゃ お題とは別に、存在しないことの確認だけだったら、 検索条件に入れればいいだけだし
91 名前:名無しさん@お腹いっぱい。 [2018/05/21(月) 18:16:23.91 .net] 質問です。 シェルスクリプトファイルを実行する方法として 1. 利用者に応じた実行権限を賦与する $ chmod +x scriptfile.sh $ ./scriptfile.sh 2. sh(1)コマンドの引数として実行する $ sh scriptfile.sh という方法がありますが,どちらがより良いか教えてください(というかスクリプトの実行結果自体にはたして違いはあるのでしょうか)。 今まで一つ目の方法しか知りませんでしたが,もし二つ目になんら欠点がなければよりコマンドの数が少ない (極端に言えばchmod(1)コマンドがなくてもできる)後者の方法を使っていきたいです。 どうかよろしくおねがいします。
92 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 18:37:27.68 .net] psで見てみ。1 でも、そのシェルスクリプトファイルのシバン(*1)で指定したインタプリタ(シェル)を、引数としてそのシェルスクリプトファイルをで起動してるから 1はコマンド、2はスクリプトファイルっていう違い。/usr/binなどの中のコマンドでも実態はシェルスクリプトやPerlスクリプト等なのがあるけど、そんなの気にしてない気づいてなくコマンドとして使ってたりするだろ? まあ、コマンドとして必要じゃない(コマンドの数が少ないって意味がわからんが一時的とかか?)んだったら、別にスクリプトファイルとしてで全然普通 1) お約束事項のような #!/bin/sh もう俺は気にしてなくて #!/bin/bash だけど
93 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 19:05:05.59 .net] 使い捨てか頻繁に使うか
94 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 19:18:46.42 .net] >>82 hogefile="test" find . -maxdepth 1 -type d -name 'hoge[0-9][0-9]' -exec bash -c "test -f {}/$hogefile || cp $hogefile {}" \; こんな感じとか?俺は、俺も、そうはしないけど。-exec は使ったことないのでどこまでできるのかよくわからんな。なのでbashスクリプトにした/逃げた
95 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 19:23:57.41 .net] >>91 ありがとうございます。 ps(1)コマンドで確認したところ,たしかに両方ともにシェルが始めに起動されていました。 (素朴な疑問なんですが,PIDが連続しているのは偶然ですか? 原理的に必然ですか?) 1の方法だと一見シェルは起動されていないように見えるけれども,シバンに書かれたシェルがまず起動するということですね。 ということは全く違いはないという理解でよいでしょうか。 >>92 なるほど。1の方法は永続的,2の方法は試験目的で一時的に作ったファイルなどに対し用いるということですね。
96 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 19:38:22.80 .net] シェルプロセスが勝手に起動されるか明示的に起動するかで、なんかあった(rcやprofileを読まないとか起動時の環境設定の動作)が今回のようなのは関係ないだろう、気にすんなw PIDはだいたい普通にインクリメント。なにかプロセスが起動するごとにそれの新しいPIDはインクリメントされた値かな
97 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 22:42:20.13 .net] OSによってはセキュリティ的な理由でPIDをある程度ランダムに割り当てるので連続にはならない。 BSD系はどれもデフォルトだとランダムじゃないかな。
98 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 23:07:13.46 .net] PIDが若いから特権があるわけでもないしPIDが推測しやすいからっていうセキュリティ懸念ってなんだろ?
99 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 23:36:33.95 .net] cat >/tmp/tmpfile.$$ みたいに手抜きな一時ファイル作成してると シンボリックリンク攻撃くらうからそのリスクを減らせたりする。 ちゃんと攻撃避ける正しい書き方してれば関係ない話だけど、 世の中にテキトーなスクリプトは尽きないから。
100 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 23:39:26.38 .net] なるほど。OSのセキュリティではなくPIDを利用したナニかに対するか
101 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 23:43:34.05 .net] ん?PIDを知ることができる(当然知ることは普通にできる)ってとこがキモで推測しやすいのとは別のような。まあ、いいや、ナニかあるなってことで
102 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/21(月) 23:47:30.91 .net] ああ、シンボリックリンク攻撃を誤解してた。事前に(大量に)シンボリックリンク作ってしまうわけね。なるほど
103 名前:名無しさん@お腹いっぱい。 [2018/05/22(火) 02:34:29.36 .net] 知り合いから教えてもらったパソコン一台でお金持ちになれるやり方 時間がある方はみてもいいかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 GXGZT
104 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/22(火) 12:13:09.28 .net] シンボリック攻撃ってシンボリックリンクを作成する時にパーミッション関連の隙を突いて本来保護されているコマンドを改竄することだよね。 大量に作成する必要なないんじゃないかしらん。もちろんある種の陽動にはなるだろうけど。
105 名前:72 mailto:sage [2018/05/22(火) 19:13:09.08 .net] >>77 >>78 これで一発で成功しました 驚いています このコードをもっと理解すると共に、自分も先輩のようなプログラマーになれるよう勉強を続けていきたいです マジで助かり、勉強になりました 本当にありがとうございました
106 名前:72 mailto:sage [2018/05/22(火) 23:19:32.73 .net] もちろん>>83 の修正も加えさせていただきました コードをくだすった方と同じ方かはわかりませんがそもそも>>75 でこちらの仕様を把握してくださったのがすごい 要求仕様、要件定義の大切さも少しわかりました そしてコードはこちらの望む通りの結果を出して一発で動きましたよと
107 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/22(火) 23:39:50.60 .net] >>105 別人だ。俺はスマホだからここにコードは書けん
108 名前:72 mailto:sage [2018/05/22(火) 23:57:04.16 .net] >>106 そうでしたかm(_ _)m いずれにせよスレの複数の先輩方にお世話になりました しかも勉強になります
109 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 03:10:49.54 .net] あのなぁ、お前さんここをどこの板だと思っているんだい? 歴史あんだぜ まあその話はもうほんとに一昔前の出来事になっちまったけどな
110 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 04:11:43.99 .net] イザナミだ
111 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 10:26:18.02 .net] 伝説って?
112 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 10:49:34.46 .net] なんだったか、2chの鯖に関する貢献があったような 当時からいたわけじゃないからどっかのサイトで知った話だが Flash黄金期にその話がFlash化されてたから見て知ったな
113 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 12:29:35.00 .net] read.cgiの改良作業だよね。 直
114 名前:接関わってはいないけど、当時はリアルタイムで見ていたし、手元の どこかに運営から住民に開示されたread.cgiも残ってると思う。 アクセスが増えて通信量が増加して、当時借りてたホスティング業者から 追い出されそうになってたんだけど、HTTPの通信をgzipで圧縮して通信量を 削減しようという話だったかと思う。 ただ、UNIX板でも話をして作業には参加していたものの、プログラム板と かの方でもガリガリやっていたような記憶がある。 [] [ここ壊れてます]
115 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 14:05:37.49 .net] それとは別に SYN flood 攻撃に対し SYN cookie 有効化で対抗した時はUNIX板で主に議論してた気がする。 リアルタイムで見てたというか発言してたけど(SYN cacheと比較した得失とか書いた気が)、 こういうのはあくまで個人としての行動なので板自慢に繋げるのは好きじゃないな。 むしろ統一とかとれてなくてカオスなのが5chの良いところだと思うので。
116 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 15:36:26.79 .net] >>112 gzip圧縮ってapacheの設定じゃないの?
117 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/23(水) 21:48:48.59 .net] 他の顧客がいるからミドルウェアで圧縮できない、というホスティング屋を使っていたんじゃなかったのかな(後から知った話だから、違うかもしれない)
118 名前:名無しさん@お腹いっぱい。 [2018/05/23(水) 23:46:31.17 .net] オイスター作戦ね もう15年は前でしょ
119 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 00:55:41.47 .net] >>113 新ブラッドなつかしす
120 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 07:58:22.34 .net] 馴れ合いならよそでやれ(キリッ)
121 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 08:33:06.96 .net] なれ合いですらなくて、おっさんが勝手に郷愁に浸ってるだけという。
122 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 20:05:30.06 .net] $ cat a.file > b.file とやるのと $ cp a.file b.file とやるので違いが生じる場合はありますか?
123 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 20:22:49.22 .net] >>120 パーミッションがどうのこうの
124 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 21:28:22.51 .net] >>120 b.fileというディレクトリがあった場合の動作
125 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 22:42:29.15 .net] ディレクトリの場合はケツに / つけろや
126 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 23:23:09.46 .net] イミフ
127 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/24(木) 23:30:13.33 .net] >>123 によると cat a.file > b.file/ ってやるといいんだって
128 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 00:17:51.08 .net] 意図してディレクトリじゃないからつけろもなんもないのにな
129 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 10:57:24.97 .net] >>120 CoWが効いたり
130 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 10:59:54.02 .net] そんなcpの実装ってある?
131 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 11:34:57.95 .net] Linuxのは実装はしてるみたいだな。デフォではないから話の流れでの実装してるとは言えんけど
132 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 14:50:09.69 .net] シェルスクリプトの勉強をするのにおすすめの本はありますか?
133 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/25(金) 15:20:37.79 .net] 最近あったな https://mevius.5ch.net/test/read.cgi/unix/1489979246/900-902
134 名前:130 mailto:sage [2018/05/25(金) 16:54:14.54 .net] >>131 ありがとうございます
135 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 04:09:24.19 .net] お知恵お借りしたいです。 awk '($3 !~ /ここにパイプ区切りで記述したい/) && ($4 ~ /01/)' output.txt 上記のawkで条件に当てはまるファイルを絞り込みたいのですが その1 別ファイルからのawkの結果を $aaa に設定してある その2 $aaa は複数列の出力なので set コマンドにて位置パラメータに分けてある その3 各変数を展開して文字列としてパイプで区切ってawkを使いたい。 以上のようなことをやってみたのですがどうもうまく行きません。 また、違うやり方もあるようでしたらご教示いただけるとありがたいです。 よろしくお願いします。
136 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 04:35:42.94 .net] > $aaa は複数列の出力なので set コマンドにて位置パラメータに分けてある これはどういう意味? set はシェル自身の設定だと思うんだけども
137 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 05:07:26.79 .net] cat ZZZ.txt |grep XXX hoge fuga と複数行でしたので aaa=$(cat ZZZ.txt |grep XXX) としてみました。 そして set $aaa と設定して $1 $2 $3 ...と変数が自動で割り振られるなら増減しても対応できるのでは考えました。 (本来は0個のときもあるのでそれも考慮しなければならないんですが) そして $1 等に入っている変数(hogeやfuga) を展開してパイプで区切れれば動くと思うんです。
138 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 07:13:03.91 .net] ごめん俺の理解が悪いと思うのだがあなたのやりたいことが見えない。 他の人にまかせるわ。 もしくはZZZ.txtの内容をプライバシーに障らない程度に具体的に教えてほしい。 「ZZZ.txtからgrepで取り出した値をパイプで連結して処理する」という文言からは ZZZ.txtには命令が一行ずつ書かれているように受け取れるのだが、そうじゃないよね。 それとも「パイプで繋ぐ」というのはシェルのパイプ実行ではなく単に文字列としてパイプを区切りとして使うという意味? もしそうなら $ cat ZZZ.txt | grep XXX | tr '\n' '|' | sed 's/|$//1' ↑こういうので行けるけど。違うでしょ?
139 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 07:35:37.60 .net] 説明がヘタですみません。ZZZ.txtの中身はyoutube等の URL タイトル 日付 がタブ区切りで複数行書かれているファイルです。 123.com hoge 02 456.com fuga 05 789.com peke 08 のような感じです。 それらから条件から当てはまる行や列を抜き出してパイプ区切りにしたいのです。 パイプの解釈は hoge|fuga で hoge or fuga と展開して awkのパターン入れて読ませたい訳です。
140 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 08:23:21.90 .net] >>137 なるほどね。こういうこと? (ZZZ.txtの代わりにヒアドキュメント使ってる) $ cat <<. | awk '($2 ~ /(hoge|fuga)/) && ($3 ~ /02/) {print}' example111.com hoge 02 example222.com hoge 03 456.com fuga 05 456example.com fuga 02 789.com peke 08 . example111.com hoge 02 456example.com fuga 02
141 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 09:09:37.27 .net] 勉強不足でヒアドキュメントの知識が浅くて申し訳ないのですが 多分合ってると思います。 うまくいかないのは hoge|fuga の部分が一定でなく peke|hoge|miso だったり fuga のみだったりするので悩ましいのです。
142 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 09:53:14.80 .net] 条件をコマンドの結果から作りたい&その条件をawkの条件に埋め込みたいってだけ? hogehuga=( $(cat ZZZ.txt |grep XXX) ) SAVEIFS=$IFS IFS=$'|' hogehuga="${hogehuga[*]}" IFS=$SAVEIFS [ "$hogehuga" = "" ] && hogehuga="0個の条件" awk '($3 !~ /'"$hogehuga"'/) && ($4 ~ /01/)' output.txt って感じとか
143 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 10:05:05.40 .net] ああ、条件の作成は>>136 の最後ですでにワンライナーで教えているのか。しつれい
144 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 10:44:16.45 .net] >>139 そのhoge|fugaはどこから来るの? grep(1)コマンドの結果?
145 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 10:58:04.08 .net] >>135 の最初で説明してね?>>135-137 は噛み合ってないだけかなw というか、>>136 の確認/質問のキモがわかってないというか
146 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 11:18:16.86 .net] 条件文の | をパイプとかいうからわけわかんなくなる