- 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/
- 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]
- 条件文の | をパイプとかいうからわけわかんなくなる
- 147 名前:133 mailto:sage [2018/05/26(土) 11:49:32.72 .net]
- そういう場合はパイプって言わないんですか。失礼しました。
正規表現でつかう or の役割を hoge fuga の間には挟みたいのです。
- 148 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:01:23.51 .net]
- >>145
>>136 >$ cat ZZZ.txt | grep XXX | tr '\n' '|' | sed 's/|$//1' >↑こういうので行けるけど。違うでしょ? って教えてくれてるやん。「違わない」「それです」でいいんじゃないの?それが違うならどう違うって言うべき
- 149 名前:かと(どうみても違わないとしか思えないけど)
質問自体がアレだが自分の言いたいことをうまく説明できないのはいいとして、応えてくれてる人の言ってることがわからない/それに応えないのはアレだな [] - [ここ壊れてます]
- 150 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:03:34.81 .net]
- awkの手前で別途 fgrep -f か egrep -f を使った方が、改行→「|」変換をサボれて楽な気がする。
fgrep/egrep -f を使うときは bashないし zsh 依存になるけど fgrep -f <(grep XXX ZZZ.txt) と書くともっと楽だね。
- 151 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:10:12.44 .net]
- \じゃないよバックスラッシュだよ
というのがありそうな気もしないでもない
- 152 名前:133 mailto:sage [2018/05/26(土) 12:32:36.46 .net]
- シェルスクリプト内で自動で行いたい旨を
書き損じておりました。 cat ZZZ.txt |grep XXX hoge fuga から awk '($3 !~ /hoge|fuga|neko/) && ($4 ~ /01/)' output.txt としたいのです。 >>146 >$ cat ZZZ.txt | grep XXX | tr '\n' '|' | sed 's/|$//1' でまさしく狙い通りの出力がされるのですが>>133のawkのパターン部にどうかけば同じ文字列が出せるかわかりません
- 153 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:38:10.49 .net]
- awk の文はただの文字列でしかない
awk '($3 !~ /'"$aaa"'/) && ($4 ~ /01/)' output.txt でも、 awk "(\$3 !~ /${aaa}/) && (\$4 ~ /01/)" output.txt でも(他にエスケープ必要なのあるかな?)、 普通にシェル変数を(文字列内に)展開するのと変わらんぞ
- 154 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:42:16.30 .net]
- 書き損じどうこうじゃなくて、受け応えができないのが致命的ではあるなw
- 155 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/26(土) 12:44:02.94 .net]
- よく見たら、
hoge fuga から hoge|fuga|neko って、nekoはどこから来たっていう。まあうっかりだろけど
- 156 名前:133 mailto:sage [2018/05/26(土) 13:37:00.34 .net]
- みなさん申し訳ありません
>>150のレスを見てクォートをよ〜く見なおしたら動きました。 初心者のたわごとに付きあわせてしまい申し訳ありませんでした。
- 157 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/27(日) 08:08:25.73 .net]
- nekoです。nekoはいます。
- 158 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/30(水) 15:51:14.73 .net]
- 寝た子は起こすな
寝子は起こすな
- 159 名前:名無しさん@お腹いっぱい。 [2018/05/30(水) 20:03:13.31 .net]
- sedコマンドでSGRを扱いたいんですがどうすればいいですか。
$ echo abc | sed 's/^a/\033[1m&\033[0m/1' などとしてaを太字にしたりしたいです。
- 160 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/30(水) 20:16:35.46 .net]
- echo abc | sed -e 's/^a/'$'\033[1m&'$'\033[0m/1'
- 161 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/30(水) 21:08:39.87 .net]
- 横からだが、
なんのこっちゃと思ったら $'' はエスケープ文字処理してくれんのね。なるほど 最初のだけでいいのでは?もしくは最初に付ける。もしくは逐一付けて閉じる echo abc | sed -e 's/^a/'$'\033[1m&\033[0m/1' echo abc | sed -e $'s/^a/\033[1m&\033[0m/1' echo abc | sed -e 's/^a/'$'\033''[1m&'$'\033''[0m/1' と思いました
- 162 名前:156 mailto:sage [2018/05/31(木) 06:51:45.12 .net]
- ありがとうございます。解決しました。
これは後出しになってしまいますが、POSIXの範囲でやりたかったので $''ではなく$(printf)を使いました。
- 163 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/02(土) 23:56:12.94 .net]
- 英語圏の序数詞を適切に処理するシェルスクリプト(というかワンライナー)を考えたのですが添削してください
$ for i in $(seq 15); do echo $i$(case $i in *1) echo st;; *2) echo nd;; *3) echo rd;; *) echo th;; esac); done 出力は一応望み通りでまたPOSIX utils+seq(1)のみで実行可能です。
- 164 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/03(日) 00:35:29.50 .net]
- 11st とか 12nd になってるけどそれはいいの?
- 165 名前:名無しさん@お腹いっぱい。 [2018/06/03(日) 00:38:58.53 .net]
- なにいっとるんやこいつw
- 166 名前:名無しさん@お腹いっぱい。 [2018/06/03(日) 01:12:42.26 .net]
- なにいっとるんやってなにいっとるんやww
|

|