awk ファンクラブat LINUX
awk ファンクラブ - 暇つぶし2ch150:login:Penguin
11/07/09 15:37:05.06 Q3LPccup.net
awkオンリーってのがムズイので、Cygwin上でsh他外部コマンドと組み合わせて使う事が多い

151:login:Penguin
11/07/09 17:09:11.40 Ne909y4H.net
結局awkはプログラミング言語というより「ちょっとややこしいことも出来るUnix系テキストツール」としての性格が強いんだと思う。

152:login:Penguin
11/07/09 17:38:27.04 OcQSMVqG.net
そうか、Windowsでの使用率は考えたことなかったわ。そっちで今何が流行ってるのかは知らないけど、
GUI扱うライブラリを持つLLが使われてそうだ。こればかりは厳しい。そもそも、ライブラリって概念がないのが避けられてるのかな。

153:login:Penguin
11/07/09 17:45:48.05 Ne909y4H.net
>>152
いやGUIはほとんどVisualStudio、Java、Delphi辺りで喰われてるよ
その他のGUIツールもあるにはあるんだけど

LLの主な出番は向こうでもテキストフィルタだったりはするんだけど
Windowsにはそもそも組み合わせるような小物のコマンド群が無いから
やりたい処理の1から10まで全部を1個(もしくは一連)のスクリプトで済ませるのが主流

だからたとえLLであっても、1言語で最初から最後までを完結できる大きめの言語が好まれるのよ
awkは単品で使うより、組み合わせで威力を発揮する言語だからか、あまり使われない

154:login:Penguin
11/07/09 17:49:54.27 Ne909y4H.net
あ、いやテキストフィルタよりもCGIとかのWebでの出番のが多いか?

155:login:Penguin
11/07/09 18:38:35.83 Q3LPccup.net
cgiでawk使う事って、珍しくないの?

156:login:Penguin
11/07/09 18:59:11.34 wbKjo2Ly.net
awkでcgiも出来なくもないだろうけど、っていうかそれでblog作ろうとしてた人もいたな

157:login:Penguin
11/07/09 19:07:48.49 OcQSMVqG.net
>>153
ホント?Delphiなんて懐かしいなぁ。GUIでなく、Webでの利用なら、もはやOSあまり関係ないような気も。よく分からん。

>>155
聞いたことはあるけど、見たことはない程度には珍しいかと。gawkはネットに対応してるから頑張ればサーバにもなれるかな?

158:login:Penguin
11/07/09 19:58:21.74 Ne909y4H.net
>>157
いやまあDelphiは新規としては瀕死で、過去遺産の保守で使われるのが主だけどね。

159:login:Penguin
11/07/09 20:14:45.59 Q3LPccup.net
やっぱawkでcgiってマイナーか。しかしblogつーか、CMS作ろうとするのは凄いなw

ちなみにgawkのhttpdって、どっかで見たなあ。

160:login:Penguin
11/07/09 20:57:21.04 CG+O7ik7.net
httプロトコルでなく、俺プロトコル用サーバならawkスクリプトでやってる。
httpに例えるなら、ファイルか404を返すだけの簡単なやつ。
しかもgawkのソケットでなく、inetdから呼ばれるだけの低機能。

161:login:Penguin
11/07/10 16:44:29.85 nBMv6TVB.net
私はエンバカになっても応援してるよ!>Delphi

>>160
今更inetdって思ってて、ろくに調べてなかったけど、socatみたいな機能もあるんだね。
ポート監視→サーバ起動って機能しかないと思ってたよ。

これならネット非対応なawkでもhttpdくらい実装できる?…バイナリまともに扱えそうなのはgawkしかねー。
テキストオンリーまでなら何とかできそうだけど、画像も転送できないか。厳しい制限だ。

162:login:Penguin
11/07/11 00:10:26.11 ShNAK0f0.net
個人的にはawkは今まで通りシェルのお供でいいと思う
perlとかでもそりゃ書けんことは無いが
シェルのお供として使うには微妙に違和感あるんだよな~

163:login:Penguin
11/07/14 01:48:17.88 I04Pjvnw.net
>>134
これを使って正規表現によって grep とどれだけ実行速度に差が出るのか計ってみた。
URLリンク(pastebin.com)

数字だけではよく分からないので、ユーザ時間のグラフを描いた。
URLリンク(i53.tinypic.com)
赤がawk、青がgrep
こっちじゃないと見れないかも → URLリンク(tinypic.com)

awk もばらつきがあるけど、grep ほどではない。
どちらも、マッチする可能性が高い正規表現は遅くなる傾向があるのかなぁ?

164:login:Penguin
11/07/14 23:45:53.76 I04Pjvnw.net
引数で与えられたファイルをメモリに読み込み繰り返し検索する
awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGV=1};{for(i=0;i<n;++i)if(a[i]~$0)print a[i]}'

最近、用途が限られているもの中心だったので使えそうなワンライナーにしてみたよ。きっと。
指摘を受けたので、スペースは削ることにしました。ちっと見づらい?

↓は大文字小文字を無視するもの。こうするとdmesgの出力を何回も検索できる。
awk 'BEGIN{f=ARGV[1];while((getline<f)>0)l[n++]=tolower(a[+n]=$0);close(f);ARGC=1};{for(i=0;i<n;++i)if(l[i]~tolower($0))print a[i]}' <(dmesg)

165:login:Penguin
11/07/15 08:26:42.31 ZNSgasJH.net
見にくいので、セミコロンで改行して欲しい。

166:login:Penguin
11/07/16 01:01:45.88 bjjWiIZ6.net
凄く長くなりそう><

167:login:Penguin
11/07/16 08:37:16.54 n6+rd2ar.net
長過ぎるone-linerを見易く改行するone-linerを書きなさい

168:login:Penguin
11/07/18 15:25:02.07 7hj9vKr7.net
しまったー!書き込む前にちょろっと書き換えたところがバグってました。mawkで動きません。

>>164の下のスクリプトは次に書き換えてください。
awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1};{for(i=0;i<n;++i)if(tolower(a[i])~tolower($0))print a[i]}'
awkのシーケンスポイントってC言語と同じなのかな…痛いミス。

おまけ。使ってるやつ。エスケープシーケンスを使って見つかった文字列に色を付けた。
awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1};
    {for(i=j=0;i<n;++i)if(k=match(tolower(a[i]),tolower($0)))print C(j=!j)I(I(a[i],C(39),k+RLENGTH),C(31),k);print C()};
    function C(n){return"\033["n"m"};function I(x,y,z){return substr(x,1,z-1)y substr(x,z)}'
パターンごとに改行を入れた。少し見やすいか?

>>164の上のスクリプトに色を付ける機能を追加。ずっと分かりやすいと思う。
awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1};
    {for(i=j=0;i<n;++i){l=a[i];if(sub($0,C(31)"&"C(39),l))print C(j=!j)l}print C()};
    function C(n){return"\033["n"m"}'
subをgsubにするとマッチする全ての文字列に色を付けられるよ。

gawkならgensub使ってもう少し短く書けるかもしれない。IGNORECASE=1で簡単に大文字小文字無視できるし。

169:login:Penguin
11/08/15 19:41:00.75 yTTHvZyj.net
classは使えるようになりましたか? > gawk4

170:login:Penguin
11/08/16 15:17:21.28 Tuhp+s5y.net
URLリンク(awk.info)

171:login:Penguin
11/08/16 15:27:51.45 2FR0TK0E.net
ちゃんとご自分で読んだものを「つ」されてますか?

172:login:Penguin
11/08/21 15:15:49.17 EL3rN3cw.net
ふるいけや "かわず とびこむ" みずのおと
といったレコードを、
field[1]=ふるいけや
field[2]=かわず とびこむ
field[3]=みずのおと
number_of_field = 3
とフィールド分割するすっりした方法を教えて下さい。

173:login:Penguin
11/08/21 16:45:12.36 iSpKRH15.net
" で split すればいい

174:login:Penguin
11/08/21 18:45:31.99 EL3rN3cw.net
やはり2chでは馬鹿レスしかつかんか。

175:login:Penguin
11/08/21 18:56:18.08 Fst2eXVD.net
>>172
それ、CSVとかでもよく語られることだけど、意外と面倒なのよ。
例えば「"」自体を文字列に入れたい場合はどうするのか、とか色々決めなきゃならんし。

176:170
11/08/21 19:12:48.13 yoctsNv6.net
あれ?awkでclass使いたいって事なんでしょ?
URLリンク(ja.wikibooks.org)

177:login:Penguin
11/08/21 19:24:48.22 yoctsNv6.net
>172
素直に区切り文字を変えるしか...

ふるいけや,かわず とびこむ,みずのおと

FS=","

178:172
11/08/21 22:01:39.45 Mb9j323G.net
自己レスです。
BEGIN { FPAT = "([^" FS "]+)|(\"[^\"]+\")" }
みたいな事をしました。

179:login:Penguin
11/08/22 10:27:15.81 bf5ta6rs.net
awk にわけわかんな機能を増やすよりも、
RFC4180 互換なフィールド分割オプションを実装すればいいのにといつも思う。


180:login:Penguin
11/08/22 10:33:38.59 uwcmdhh8.net
馬鹿の巣窟にわざわざ書き込むな馬鹿

181:login:Penguin
11/08/22 11:11:08.80 4smqF+KA.net
見事に馬鹿の巣窟と化したねえ

182:login:Penguin
11/11/28 19:46:48.89 NIKBR+N1.net
perl -e 'print $1 if /href="(¥d¥d¥d¥d-¥d¥d¥-¥d¥d)"/'
と同じことをawkでやろうとしているのですがわかりません。
awk -e '/href="(¥d¥d¥d¥d-¥d¥d¥-¥d¥d)"/ { print ??? }'
グルーピングしたあとにそれを取り出す方法を探したのですが、わかりませんでした。
awkまたはsedでのやり方を教えて下さい。



183:login:Penguin
11/11/28 20:46:46.52 skmC2JM9.net
>>181
馬鹿じゃないあなたに是非>>182の回答をしてもらおうか。

184:login:Penguin
11/11/28 21:15:52.48 Oo5SGhpX.net
>>182
perl がわからないから求めるものがよくわからないけれど、こんな感じ?

awk '/href=\"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\"/ {print $1}' input.html

awk '/href=\"\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\"/ {print $1}' input.html

BEGIN とか使ったほうがいいのかもしれないけれど
awk '/href=\"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\"/ {print $1} BEGIN { 何か書く }' input.html

185:login:Penguin
11/11/28 23:48:15.14 mynsjW2o.net
>>182
どのawk使っているか分からないし、入力の仕様も分からないけど、どこでも動くのはこんな感じ
awk -F\" '/href=/ { for (i=1; i<=NF; i++) if ($i ~ /href=$/ && $(i+1) ~ /[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/) print $++i }'
gawkでも正規表現パターンのグループを保存している組み込み変数はなかった気がする

186:login:Penguin
11/11/29 00:49:47.68 6tCpTQmb.net
gawk4.0なら
awk '{if (match($0,"href=([0-9]{4}-[0-9][0-9]-[0-9][0-9])",a)) print a[1]}'
じゃ駄目?

187:login:Penguin
11/11/29 01:04:03.02 6tCpTQmb.net
ごめん、
awk '{if (match($0,"href=\"([0-9]{4}-[0-9][0-9]-[0-9][0-9])\"",a)) print a[1]}'

188:login:Penguin
11/11/29 16:01:19.31 vLvhB/JG.net
>>184-186
うーん、あまりわかりやすい方法ではないですね。
メンテナンスしにくいコードになってしまうので、perlが使えるよう上司に交渉したほうがよさそうです。
回答いただいた方、ありがとうございました。

189:login:Penguin
11/11/29 16:28:12.31 MmS6Zrem.net
>>185はともかく>>186-187の方がPerlみたいにグローバル変数にマッチ結果を入れるより分かりやすいと思うのって俺だけ?

190:login:Penguin
11/11/29 17:00:24.97 vLvhB/JG.net
>>189
186は、単にgawk独自の拡張機能を知ってないとわかりにくいというだけであり、
マッチした結果を明示的に変数に代入するのはいいことだと思います。
なお個人的には
match(string, rexp, matched)
はmatchedがいわゆるout変数になるため分かりにくいです。
matched = match(string, rexp)
のほうがよかったです。

191:login:Penguin
11/11/29 17:27:04.96 8ESv/UnH.net
>>190
何言っているのかちょっと分からん。言語仕様上awkは配列を返せないだろ

192:login:Penguin
11/11/30 00:16:56.92 CRejWMLU.net
gawk独自の実装はどうも…という話がよく出てくるけど、
gawk/mawk/true awk相互で運用する必要ってよくあるものなの?
またはbusyboxのawkで使いたいとか?

193:login:Penguin
11/11/30 02:39:57.37 TGbwU425.net
gawkは最早awkと呼ぶには拡張され過ぎている感じがある
よくあるかは知らないけど、少なくとも手元の環境には3種類のawkがあって、gawkの拡張が使えない
mawkはnextfileにも対応してないし、awkは実装の差がかなり大きいと思うよ

194:login:Penguin
11/12/01 00:38:55.88 cIbdY7f8.net
gawkが拡張されてるのは承知だが、gawk依存だとメンテが大変だから
perlというロジックが分かりにくい。



195:login:Penguin
11/12/03 01:06:16.24 0aRpOAWF.net
gawkで

(ああ(いい((うう)(ええ))))

この行の「ああ」「いい」「うう」「ええ」を変数に入れたい時、
何か定番な書き方はありますか?

196:login:Penguin
11/12/03 01:56:31.82 ivCb+cNz.net
何を期待しているのか分からん
括弧を区切りにして分けたいだけならFS="[()]+"で
配列に入れたいならsplitでどう?

197:login:Penguin
11/12/03 01:59:50.51 ivCb+cNz.net
もしかして括弧の対応をとりながら分けたいってことなら
gawkに詳しい別の誰かに期待してくれ。拡張正規表現でも無理じゃなかったか

198:login:Penguin
13/03/07 06:45:54.68 4D+kiInZ.net
str = "(ああ(いい((うう)(ええ))))"
while (match(str,/([^()]*)/)) {
v = substr(str,RSTART+1,RLENGTH-2)
str = substr(str,1,RSTART-1) substr(str,RSTART+RLENGTH)
if (v != "") {
# 取り出した v をなんかする
}
}
とかじゃ駄目なの?
ちゃんと構文解析するなら yacc (bison) を使わないと駄目だよ

199:login:Penguin
13/03/12 12:42:06.70 qyuXfAO9.net
      _
      |O\
      |   \ キリキリ
    ∧|∧   \ キリキリ
ググゥ>(;⌒ヽ    \
    ∪  |     (~)
     ∪∪   γ´⌒`ヽ
     ) )    {i:i:i:i:i:i:i:i:}
     ( (    ( ´・ω・)、
           (O ⌒ )O
            ⊂_)∪

200:login:Penguin
13/03/20 12:52:31.89 YjhinaPB.net
しつもん
URLリンク(gauc.no-ip.org) のスクリプトの35行目

for (++day;;) {

の意味と動作がよくわからんです
which で等価なループを書くとどんな感じになるの? カコイイ先輩おしえてplz

201:login:Penguin
13/03/20 20:01:52.34 BDkPT9MX.net
>>200
++day; while (1) {

202:login:Penguin
13/03/20 22:53:22.42 YjhinaPB.net
>>201
先輩ありがとう
++day を最初に持ってくるのはオイラも考えたんですが、break の条件式も反転して持ってくればおkかなと思って

$ diff time.awk time2.awk
34,35c34,35
<
< for (++day;;) {
---
> ++day;
> while (day >= year_days) {
49,52d48
< }
<
< if (day < year_days) {
< break;

てやったら1日ズレちゃったんだけどこれってどこがマズいんでしょうか (・ω・` )

203:login:Penguin
13/03/22 01:16:43.88 Jmj0m+XB.net
>>202
そのbreakの後にも続きの処理があるだろ。年もズレるんじゃない?

204:200
13/03/24 14:19:31.22 UI34mYpn.net
>>203
day の値を追っかけてみたら元のfor、変更後のwhileともに同じ値で終了してたので頭抱えてたんですが
もう少し調べてみたら leap の値がズレてました
break の前の処理が1回分少なかったということで、落ち着いて考えれば当たり前の結論でした (;´Д`)

結局この処理の場合は元々のスクリプトや >>201 のように無限ループ使うのが一番シンプルに
書けるんだなーと確認して納得しました。先輩方ありがとう

205:login:Penguin
14/03/21 07:35:13.02 TlIvqwz8.net
>>205
URLリンク(www.amazon.co.jp)

206:login:Penguin
14/03/21 13:50:53.67 2joEzm1b.net
たけえわ!
こういう本こそ電子版にしてくれねえかなあ

207:login:Penguin
14/03/21 22:38:59.40 +P5ZN4Ej.net
レスありがとうございます
高いけどあるといえばあるんですね
どうしようかな

208:76
14/03/21 23:39:07.83 UPcdeELD.net
ブックオフで先週見たぞ

209:login:Penguin
15/01/24 09:55:38.14 gAuUge45.net
持ってたけどいつの間にか捨てていた

210:login:Penguin
15/01/24 12:11:48.77 4AXaMrRk.net
紙質が悪くてボロボロになった

211:login:Penguin
15/02/03 13:34:28.90 lZQLBw3l.net
Linuxも電子版出してほしいな(´・ω・`)

212:login:Penguin
16/08/29 23:40:58.70 W/IDgrhA.net
Gawk4.1.4出てたのか。

213:login:Penguin
16/11/09 18:03:36.84 XXe91GfC.net
なつい

214:login:Penguin
17/01/25 11:01:32.67 6VFENplc.net
長年親しんだテキストの遊園地がなくなってて非常に悲しい
どっかにアーカイブないっすか

215:login:Penguin
17/03/17 05:15:18.56 RjcJSjOQ.net
>>214
で、それはいつできるんだ?
できたらURL貼るのを忘れんなよ

216:login:Penguin
17/03/17 05:22:31.32 RjcJSjOQ.net
URLリンク(archive.org)
The AWK Programming Language

217:218
17/07/10 19:23:00.44 EatnUbnm.net
おばんです。
Linux環境の方にお願いします。
下記にあるblength()を試してもらえませんか?
URLリンク(www1.bbiq.jp)
よろしくお願いします。

218:デフォルトの名無しさん
17/07/11 08:37:02.92 7nEGt2Mb.net
なぜそれを Linux で? 何を知りたい?

219:218
17/07/11 08:56:48.21 WwRbMPQQ.net
HP製作者です。当方の環境はWindowsです。
Linux環境下で同じ実行結果を得ることができるのか、
知りたいのです。
よろしくお願いします。

220:login:Penguin
17/07/11 11:06:05.29 DDC9W9sY.net
いい機会だからLinux入れちゃえば

221:218
17/07/11 11:10:26.52 WwRbMPQQ.net
それもそうですね。
昔々REDHATだったか入れていました。
現在のおすすめのディストリビューションは何でしょうか?

222:login:Penguin
17/07/11 12:32:44.18 tm800Hl5.net
今はMS製のcygwinみたいのがあるのでは。Windows 10 Bashナントカ

223:218
17/07/11 12:42:28.77 b8V9VslP.net
Windows 10 Creators UpdateでUbuntu 16.04.1 これかな。
やってみます。ありがとうございました。

224:login:Penguin
17/11/21 02:37:01.57 PQah4bj0.net
jgawkをガウォークって読んでたマクロスヲタいない

225:login:Penguin
17/12/29 14:37:58.78 S/CsVkMC.net
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
DCQTVO9E2N

226:login:Penguin
18/01/15 20:15:48.31 eZF7GqQ1.net
空の配列はどう作るの。
bashの declare -a var 相当。

227:login:Penguin
18/05/22 08:18:57.94 Czl6p0FW.net
僕の知り合いの知り合いができた副業情報ドットコム
関心がある人だけ見てください。
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
V09DR

228:login:Penguin
18/08/06 01:01:52.57 lYVh6drB.net
Linux Beep Musicに感動したのでnokia2beeps.tclを移植してみた
URLリンク(pastebin.com)
nokia2beeps.awkとか保存し下記のページのコードを鳴らすやつ
URLリンク(nokia.nigelcoldwell.co.uk)
あと日本語の着メロも対応してる(コメント参照)

229:login:Penguin
18/12/26 23:28:57.46 41RDdYnE.net
awk だけど実行ファイルのフォーマットは ELF …いや、なんでもないです。

230:login:Penguin
19/02/17 10:18:47.85 tq2CmSlw.net
初心者ですが正規表現で半角をすべてというのはどうやるんでしたっけ
どっかで見たような気がするんですが

231:login:Penguin
19/02/17 14:29:57.54 kuwCjzfH.net
「半角」ってどう定義するのか難しいな
この辺読んでがんばれ
URLリンク(www.gnu.org)

232:login:Penguin
19/02/18 16:59:38.97 bs/RCYIZ.net
>>226
Awk の識別しは、最初っから空の配列だよ
いきなり使えば良い

233:login:Penguin
19/02/18 17:04:21.28 bs/RCYIZ.net
みなさんはgawk以外の処理系に移植できるか
とか、多少でも考えますか?私は気にしなくなりました。
他にも幾つか実装があるにはあるんですが、あんまり
活発じゃないし、言及もされないし、こだわりすぎると
不便でしょうがないから、気にしなくなりました。
けしからんでしょうか?

234:login:Penguin
19/02/18 20:36:34.78 uVw99/R9.net
GNU awkが事実上標準だからPOSIX準拠は気にしないな

235:login:Penguin
19/02/22 21:05:04.57 HUsgEyAs.net
AWK48!!

236:login:Penguin
19/04/17 15:19:28.33 j5OQY4r8.net
GNU AWK 5.0がリリース。8年ぶりのメジャーバージョンアップ。正規表現ライブラリが
GLIBCからGNULIBへ移行、名前空間が実装 2019年4月17日
URLリンク(www.publickey1.jp)
UnixやLinuxにおいてsedやgrepなどと並んでよく知られているツールの1つがawk(オーク)
です。このawkのGNUプロジェクトによる実装の最新版「GNU AWK 5.0」(gawk 5.0)の
リリースが発表されました。
2011年にリリースされたGNU AWK 4.0から8年ぶり、直前のバージョンでとして2017年10月に
リリースされた4.2.0からは約1年半ぶりとなります。
AWKはいわゆるスクリプティング言語の一種。変数や関数、制御文など基本的な構文を備え、
テキストファイルを効率的に処理できるのが特徴です。
GNU AWK 5.0の新機能としては、printfの%aおよび%Aの書式がPOSIX標準に準拠したこと、
正規表現のルーチンが、長年にわたってメンテナンスされてきたGLIBCからGNULIBに
置き換わったことなど。
また、識別子に非英語文字を使うためのドキュメント化されていなかったオプションなどは
削除され、ソースコードはC99環境が想定されるようになっています。
そして新たに名前空間が実装されています(詳細はマニュアルを参照とのこと)。

237:login:Penguin
19/04/17 17:39:45.30 oKn1+k+8.net
名前空間って、これまでのスクリプトが動かなくなるんだべか。

238:238
19/04/17 22:27:02.77 oKn1+k+8.net
さすがにそれは無かった。
$ gawk --version
GNU Awk 5.0.0, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
:
$ gawk 'BEGIN{print awk::ARGC}'
1
$ gawk 'BEGIN{print ARGC}'
1
$

239:login:Penguin
19/12/04 08:39:54 EOFhhwOn.net
ageで行こう

240:login:Penguin
19/12/04 18:18:20.57 8Zd1xJ0mr
>>226
BEGIN {
for (i in a); #空配列作成

if (isarray(a)) print "aは配列である";
else print "aは配列でない";
}

241:login:Penguin
19/12/10 14:57:28.86 RI3PNloA.net
gawkでキーボードから一文字入力をしたいんですが、何かいい方法ないでしょうか?
stdinをgetlineするのではなく、キーを何か一つ押したときにそのコードを即座にgawkで受け取りたいんです。
具体的に何がしたいのかというと、BEGIN内部でスクリプトの動作を設定するパラメタをキーボードで指示したいんですが、
その支持を矢印キーでメニュー選択させたいんです。
ターミナルのエスケープシーケンスはVT100環境を想定しています。
何かヒントでもいいので一文字入力の方法を教えてください〜
gawkはこれ使ってます。
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)

242:login:Penguin
19/12/10 15:04:17.01 RI3PNloA.net
追記
gawkを動かす環境はubuntu19.04で、主にWindowsからteratermでsshログインしての使用を考えています。

243:login:Penguin
19/12/10 19:53:29.48 /8T+qheh.net
>>241
awkじゃなきゃあかんの?
cursesでやればいいと思うけど

244:login:Penguin
19/12/11 00:25:34.40 ysC5v/gW.net
>>243
awkでやりたいんですよ。
cursesってawk用ライブラリありましたっけ?
自分アホなりに色々調べて、"read -n 1" をうまく使えば文字コード取れそうという所までは気がついたんですが、
これをawkスクリプト中で実行させて戻り値をawk変数に取り込む方法がわかりません。
どうすれば文字コードが取れるんでしょう?

245:login:Penguin
19/12/11 03:25:34.73 YST7j856.net
試さないで適当に書いてみるけど
一文字読みとる command 用意して
command | getline var
もしくは入力された文字を終了ステータスとして返す command で
var = system(command)

246:login:Penguin
19/12/11 09:57:26 JotyB0zR.net
試してから書きゃいいのに。

247:login:Penguin
19/12/11 17:11:40 w4fDC3xv.net
>>244
確かにそれはちゃんと機能する。しかし、矢印キーとなると話は別だ。
矢印キーは 3 バイトだから。
1 バイト読んで ESC だったらもっと読むということになる。
もちろん ESC じゃなかった場合のことも考える。
想定した処理が全部終わった後で、印字可能文字で 1 行で出力する
…というプログラムを C で書くということになるかなあ。
ところでエコーバックはどうする? 多分、こんなこともしたくなるんじゃないか。
URLリンク(qiita.com)

dialog とか使った方がいいんじゃないかな。

248:login:Penguin
19/12/12 01:58:28.69 +gdBEfoc.net
なんかすみません。
dialog & shell & awkでできるのはわかってるんですが、なんか負けたような気がしてw
なんとかshellのコマンドか標準で入っている外部コマンド & awkでできないもんかと思ったんです。
Linux ←→ Windowsのポータビリティを考えた場合、やはり1文字入力してそれを返すだけの小さなプログラムをCで作ってawkでそれを呼んで戻り値を得るのが一番手っ取り早いのかな、と思いつつあるところです。
でも、もう少し最初の路線で調べてみます。徒労に終わりそうな気はしますが。

249:247
19/12/12 16:49:42.78 Ks56aDFp.net
bash でも出来なくはないと思う。読むだけならいくらでも出来る。
しかし、「残さず食べる」ということを考えると read -n はちょっと…
なぜこれを考える必要があるかというと、食べ残しがあるとたとえばシェルの場合なら
それをコマンドラインだと思って読んでしまっだりする。
read -n は食べ残しが無かったら入力待ちになってしまうので適していないと思う。
他人に使わせるプログラムなら常に意識しておくべきことかもしれない。
そこで、まだ試してないならこんなことを試してみてほしい。
BEGIN {
cmd = "bash -c 'TMOUT=5 ; read -N 8 v ; echo \"$v\" ;'"
for( i = 0; i < 8; i++){
while ( 0 < ( cmd | getline)){
print "i=" i ", 0=[" $0 "]"
}
close( cmd)
}
}
得られたデータの長さが指定した長さに達していないならタイムアウトで終了した。
つまり、食べ残しは無いということになると思う。
ただし、改行の扱いがめんどくさい。
bash は read で読んだ改行をちゃんと送っているのだが getline が削除してしまう。
そして最後の改行は echo が加えたもので、read で読んだのではない。
awk の方で RS の値を変えることでめんどくささが減る可能性はある。
しかしやはり最終結果だけを 1 行で受け取るほうがいいかもしれない。
もっとも、入力元を共有しているから食べ残しが問題になるのであって
新たに端末エミュレータを起動してその上で実行するのなら問題にならない。
パイプが繋がらないから別の方法で結果を返す必要はあるが、メニューを出して
ユーザに選択させるという用途なら悪くない方法かもしれない。

250:login:Penguin
19/12/12 17:04:12.98 Ks56aDFp.net
そもそも「リターンキーで決定」とかなら食べ残しの心配は無いかな?

251:login:Penguin
19/12/13 04:10:04.34 For+FbwN.net
ありがとうございます。
-Nオプションでタイムアウト指定をするというのは目からウロコでした。
秒数を1にして、できるだけレスポンスのいい動きをさせようと思います。
矢印キーは3文字、Fnキーは5文字になるんですね。
そんなことも知りませんでした(汗
今日はawkにはpythonやperlにはあるord関数とchr関数が無いことを知って愕然としてました(笑)
文字を受け取ったはいいものの、文字コードをどうやって調べようかと悩んで行き着いた先のコードです。
笑ってやってください。
function ctblmake(ctbl) {
for (i = 0; i < 255; i++) {
ctbl = ctbl sprintf("%c", i);
}
return ctbl;
}
function ordhex(c) {
return sprintf("%02x", index(ctbl, c)-1);
}
BEGIN {
ctbl = "";
ctbl = ctblmake(ctbl);
print ordhex("?");
print ordhex("c");
print ordhex("b");
}
今日はもう寝ます

252:login:Penguin
19/12/13 09:49:46.45 WFJlAa92.net
perlとかでやれよ。
awkで簡単に出来ることをsed+grepで頑張る人達がクダスレ辺りに沢山いるが、それと同等だろう。
知恵の輪としては面白いけれど、成果には乏しいのでないか。

253:login:Penguin
19/12/13 13:58:14.66 +ky049vi.net
それを言っちゃあおしまいよ

254:login:Penguin
19/12/13 20:04:51.41 For+FbwN.net
なんか、返事するのがアホくさくなってきました。
さようなら。

255:login:Penguin
19/12/13 22:45:11.81 db+XusY3P
頭使って面白いなら、贅沢に時間使ってAWKでできること
何でもやるべき
時間がなきゃ252みたいになる
成果?笑わせる

256:login:Penguin
19/12/13 23:44:48.59 gNHNDwLS.net
awkはまずデータファイルありきで便利なものだしねえ。
趣味でどういう使い方しても勝手だけど。

257:login:Penguin
19/12/14 09:10:47.22 b3dqliHo.net
>>254
Perl を知っていながら awk でやろうってんだから、この程度のことは予想できたでしょう。
無視してりゃいいんだよ。
もっとも、真剣に取り組んでいるなら他の場所を探してもいいかもしれない。
でもここにも君を助けようとした者がいたことは覚えておいてほしい。

258:login:Penguin
19/12/14 09:34:23.87 b3dqliHo.net
あっ、某知恵袋はやめときなさい。あそこは知ったかぶりが多いから。
知らないなら回答しなきゃいいのにね。

259:login:Penguin
19/12/14 10:22:52.96 pIVSIbEK.net
>>258
Linuxオタが集う外国の掲示板当たりの良いのかもな
普通のLinuxユーザーなら、awkにこだわりすぎの変な奴だになって
相手にしてはいけない・からかってやれだろうからな。

260:login:Penguin
20/01/01 02:33:22.62 TglKmVwfj
>>259
海外の方が盛でしょうしね

261:login:Penguin
20/01/23 22:20:41.03 uGOVD2VtY
teratailというところでawkの質問・回答見てきたけど
あんまりおもしろくなかった
純粋にawkの質問というのが少ない
この板は貴重、保護するに値する
やる気をスポイルするの今度から禁止な


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch