20210417のLinuxに関する記事は6件です。

Linux テキスト処理に関するコマンド-まとめ

はじめに はじめまして!現在DMM WEB CAMPに通わせていただいております、かいかいと申します! 最近Linuxの勉強をしておりまして、こんなコマンドがあるのか!知らなかった!! ってものが数多く存在したので、その中でもテキスト処理に関するものをまとめていこうと思います。 目次 ・wc コマンド(標準入力として受け取った値を表示する) ・sort コマンド(色々な基準で、ファイルの中身を並び替えて表示する) ・uniq コマンド(ファイル内の重複内容を取り除いて表示する) ・cut コマンド(フィールドが区切り文字で表示されているファイルで、特定のフイールドの値だけを表示させる) ・tr コマンド(文字を変換、削除する) ・tail コマンド(ファイル内の末尾を表示する) 前提条件 シェルには、bushを使用しています。 bushのバージョンは、3.2.57です。 ちなみに、bashのバージョンは、以下のコマンドで確認することができます。 $ bash --version 使用するファイル 今回、例で使用するファイルとして、以下のような内容のテキストファイルを使用します。 sample.txt aoyama aoyama takahashi takahashi aoyama katou kitagawa wcコマンド wcコマンドは、対象ファイルの行数、単語数、バイト数を表示するコマンドです。 例えば、以下のようなファイルが存在した場合には、このような表示をします。 $ wc sample.txt 7 7 56 sample.txt 左から、行数、単語数、バイト数、ファイル名を表しています。 また、オプションとして、-l,-w,-cが存在し、それぞれ行数だけ、単語数だけ、バイト数だけを表示させることができます。 よくある使い方として、-lオプションを指定することで1行に一つデータが存在するようなファイルであれば、データの総数を簡単に求めることができます。 sortコマンド 行単位で、テキストをソートすることができるコマンドです。 オプションなしで使用した場合、アルファベット順にファイル内を並び替えて表示することができます。 $ sort sample.txt aoyama aoyama aoyama katou kitagawa takahashi takahashi もともと5行目にあったaoyamaが3行目に上がっていたりと、アルファベット順に並び替えられていることがわかります。 オプションとして、 -n ・・・数値順(少ない順)に並び替えを行う。 -r ・・・逆順(降順)に並び替えを行う。 などがあります。 uniqコマンド 重複している内容の行を取り除いたりすることができるコマンドです。 $ uniq sample.txt aoyama takahashi aoyama katou kitagawa しかし、使用点に注意があります! uniqコマンドは、何もオプションをつけていない場合は、「同じ内容の行が連続している場合は取り除く。」 という性質を持っているので、今回の例では、離れているaoyamaが取り除きれていないことがわかります。 解決策として、先程のsortコマンドでアルファベット順に並び替えた後、uniqコマンドを適用することで、全ての重複行をまとめて表示させることが可能になります。 $ sort sample.txt | uniq aoyama katou kitagawa takahashi また、よく使われるオプションとして、「-c」があります。 これを使用することで、重複している行がいくつあったかを表示させることができます。 左に出ている数字が、もともと重複していた行数を表しています。 $ sort sample.txt | uniq -c 3 aoyama 1 katou 1 kitagawa 2 takahashi cutコマンド cutコマンドは、対象ファイルのフィールドを指定して、指定フィールドだけの値を取り出すことができるコマンドです。 例えば、以下のようなフィールドを「:」で区切られたファイルがあったとします。 sample2.txt aoyama1:aoyama2:aoyama3:aoyama4 katou1:katou2:katou3:katou4 satou1:satou2:satou3:satou4 このファイルの、フィールドが2番目、つまりaoyama2,katou2,satou2の部分だけを取り出して表示させたい時には、以下のようにcutコマンドを使用します。 $ cut -d <区切り文字> -f <フィールド番号> <対象ファイル名> $ cut -d : -f 2 sample2.txt aoyama2 katou2 satou2 上記のようにすると、フィールド番号が2の値だけを取り出すことができます。 今回の場合は、-dオプションで区切り文字を「:」に指定 フィールド番号は-fオプションで、「2」を指定しています。 trコマンド 文字を置換することができるコマンドです。 注意点として、文字列を置換するわけではなく「一文字単位での置換」となります。 $ tr <置換前の文字> <置換後の文字> 例えば、先程使ったsample2.txtのaをAに、tをTに置換してみます。 cat sample2.txt | tr at AT AoyAmA1:AoyAmA2:AoyAmA3:AoyAmA4 kATou1:kATou2:kATou3:kATou4 sATou1:sATou2:sATou3:sATou4 ここで注意して欲しいのは、atという文字列をATという文字列に置換しているのではなく、aをAに、tをTに別々に変換している点です。 もし文字列を置換したい場合は、別のコマンドである、awkコマンドや、sedコマンドを使用する必要があります! もう一つ、注意点なのですが、今回のtrコマンドはファイル名を以下のように直接指定して処理がうまく行かず、標準入力に対してしか処理を行うことができませんので、ご注意を! $ tr at AT sample2.txt  <=直接ファイル名を指定 #うまく行かず、下のような表示が出てしまう。 usage: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2 trコマンドは、文字を置換するだけでなく、削除することもできます。 以下のように、-d オプションをつけることで、削除ができます。 $ cat sample2.txt | tr -d a oym1:oym2:oym3:oym4 ktou1:ktou2:ktou3:ktou4 stou1:stou2:stou3:stou4 また、削除文字に"\n"を指定することで、改行コードを削除し、全てのデータを一行で表示させることもできる。 $ cat sample2.txt | tr -d "\n" aoyama1:aoyama2:aoyama3:aoyama4katou1:katou2:katou3:katou4satou1:satou2:satou3:satou4 tailコマンド tailコマンドは、ファイルの末尾を表示するコマンドです。 1~15の値が行ごとに記述してあるファイルの使用すると、以下のように表示させることができます。 sample3.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 オプションをつけない場合は、末尾の10行を表示します。 $ tail sample3.txt 6 7 8 9 10 11 12 13 14 15 -n オプションを使用すると、表示させる行数を指定することができます。 また -f オプションをつけることで、リアルタイムでファイルの末尾を表示させることができます。 -f オプションは、Linuxの運用作業中などに、ログファイルを監視するのによく使われます。 終わりに 今回は、Linuxを使用する上でテキスト処理に関するコマンドの一部を紹介しました! 間違っている解釈などがございましたら、ぜひ教えていただけると幸いです。 参考文献 以下の本で勉強させてもらってます。とてもわかりやすくて、プログラミング勉強してるけどちょくちょく出てくるLinuxってなんやねん!!って人におすすめです!! 新しいLinuxの教科書-著者:三宅英明さん、大角祐介さん
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curlコマンドのマニュアルを読んだ

curlコマンドのマニュアルを読んだのでまとめます。 英語は得意ではないので解釈が間違っていたらすみません。 書式 curl [option] URL 説明 curlはサーバー間で1つのプロトコルを使いデータをやり取りする。 サポートしているプロトコル: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP curlの転送関連にはlibcurlが使われている。libcurl(英語) URL URLの構文はプロトコルによって依存する。詳しくはRFC 3986を見てと書いてある。 RFC 3986。長いので時間のある時にでも。 URLは以下のように中括弧を使って複数指定することができる。 http://site.{one,two,three}.com シーケンス また、[] を使うと英数字を使ってシーケンスを表現できる。 シーケンスをネストすることはできないが、{}, []を組み合わせることができる。 ftp://ftp.sample.com/file[1-100] ftp://ftp.sample.com/file[a-z] ftp://ftp.sample.com/file[a[abc]b] ←これはできない ftp://ftp.{test,sample}.com/dir[1-9]/file[001-100].txt 最後の行のように001-100とした場合、0も読み込まれるからfile001などにマッチする。 下記のように書くとステップカウンターというらしくセミコロンを使って指定したN番目ごとの数値を取得できるらしい。(よくわからない) ftp://ftp.sample.com/file[1-10:3] URLのエスケープ {}や[], ?, *などをエスケープする場合、URL全体を二重引用符(")で囲う。 IPv6についての説明も載っていましたが、そんなに詳しくないのでIPv6を勉強してから改めて載せなおします。 プロトコルを省略した場合 使おうとしているプロトコルを推測してくれる。デフォルトはHTTPだが、使用頻度の高いホスト名に基づいて推測されます。 コネクションの再利用 データを転送する際にコネクションを再利用するためあまりにファイルが多い場合は利用できない。 だが、コネクションの再利用によって転送速度が向上している。 コネクションは単一のコマンドでのみ再利用される(個別のcurl間では利用されない)。 進歩状況 表示のされ方 curlコマンドは操作中、データの転送量や転送速度、残り時間などの進歩状況を表示します。 進歩状況はバイト単位で表示されます。(転送速度はbytes/secondで表される) さらに、単位は1024バイトを元にしている。ex) 1k=1024, 1M=1048576 curlはデータをデフォルトとしてターミナルに表示する。しかし端末にデータが書き込まれる場合、進歩状況と出力されるデータが混ざってしまうため進歩状況の表示は無効になります。 HTTPのPOSTとPUTにおける進歩状況の表示 HTTPのPOSTとPUTリクエストで進歩状況を表示したい場合は、シェルのリダイレクト (>)や-o, --outputオプションを使う。 FTPの場合はこの操作ができないため、ターミナルに出力される。 進歩状況をバーに変える方法 進歩状況をバー(bar)に変えたい場合、--progress-bar, -£(ポンドはoption+3)を使う。 表示しない方法 進歩状況を非表示にしたい場合、-s, --silentを指定する。 オプション curlコマンドのオプションはとても多いし、まとめている人も多いので参考になる記事を載せます。 詳細が知りたい場合は頑張ってマニュアルを読んでください。(見た感じ1000行くらいはありました。) ファイル デフォルトの設定ファイルは~/.curlrcです。-K, --configで詳細を見れます。 環境変数 仕様 環境変数は大文字か小文字で指定できます。(envとENVが存在する場合は小文字が優先される) しかしhttp_proxyは例外で小文字でのみ利用可能です。 環境変数を利用してプロキシを設定すると、-x, --proxyオプションと同様の挙動をします。 変数一覧 ・http_proxy [protocol://]<host>[:port] HTTPで使用するプロキシサーバーを設定する。 ・HTTPS_PROXY [protocol://]<host>[:port] HTTPSで使用するプロキシサーバーを設定する。 ・[url-protocol]_PROXY [protocol://]<host>[:port] [url-protocol]のプロキシサーバーを設定します。ここで指定できるのはcurlがサポートしているプロトコルでありFTP, FTPS, POP3, IMAP, SMTP, LDAPなどです。 ・ALL_PROXY [protocol://]<host>[:port] プロトコル固有のプロキシが設定されていない場合に使用するプロキシサーバーを設定する。 ・NO_PROXY <comma-separated list of hosts/domains> プロキシを経由してはいけないホスト名のリスト。アスタリスク「*」のみ指定すると全てのホストネームにマッチする。 このリスト内のホスト名は、ホスト名を含むドメイン名かそのホスト名自体にマッチする。(IPアドレスを指定することもできる。その場合IPv6は括弧なしで指定する必要がある。) また、-x, --proxyオプションでこの環境変数を指定した場合もプロキシの使用を無効にする。 プロキシ・プロトコル curlのバージョン7.21.7からプレフィックスをprotocol://とするとプロキシプロトコルを指定できます。 プロキシ文字列にプロトコルが設定されていない場合、もしくはサポートしているプロキシと一致しない場合はHTTPプロキシとして扱われます。 サポートされているプロキシプロトコル ・http:// ・https:// ・socks4:// --socks4 と同じ。 ・socks4a:// --socks4a と同じ。 ・socks5:// --socks5 と同じ。 ・socks5h:// --socks5-hostname と同じ。 exitコード 様々なコードがありますが、この記事の執筆時でのexitコードは以下の通りです。 1 : サポートされていないプロトコル 2 : 初期化に失敗しました 3 : URLの構文が正しくありません 4 : 実行に必要なオプションなどが指定されていないか、ビルド時に無効になった。 ビルド時に無効になった場合、別のlibcurlのビルドが必要です 5 : プロキシを解決できませんでした 6 : ホストを解決できませんでした 7 : ホストへの接続が失敗しました 8 : サーバーの応答が変です。(サーバーデータがcurlの解析をできませんでした) 9 : FTPのアクセスが拒否されました。サーバがログインもしくはアクセスを拒否しています。 10 : FTPの受け入れに失敗しました。FTPセッション使用中にサーバが接続し直すのを待っている間にエラーコードが送信されました。 ... 確認したところ92番までありこの記事ではまとめられないので、マニュアルをご参照ください。 93番以降は今後リリースされるらしいです。 Authors/Contributers Daniel Stenberg(ダニエル・ステンバーグ)が主な著者です。貢献者のリストは別のTHANKSファイルにあります。 curlのサイト 最後に 英語の翻訳ミスがあったらすみません。 誰かの役に立てたら幸いです。^_^ 間違いなどございましたらご指摘ください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

改行コードを変数へ入れる(POSIX)

こんにちは。 改行などのコードを、変数へ入れました1。シェルスクリプトなどで使う目的です。 lf.sh #!/bin/sh LF=$(printf "%s\n" "") TAB=$(printf '\t') ESC=$(printf '\033') 参考:「シェルの文字列変数に改行を書き入れる方法」 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux]mkdirコマンド

コマンドの個人復習メモ mkdirとは make directoryの略でフォルダを作成するコマンドです。 $ mkdir フォルダ名 特徴 1つのフォルダしか作れない 【OKパターン】 カレントディレクトリに fruits/ フォルダ1つだけを作成は出来ます。 mkdir fruits 【NGパターン】 例えば、tomatoフォルダを作るために vegetable/tomato/の2階層分をまとめて作成は出来ません。 mkdir目線だとvegetable/tomato/の指定は コマンド君 「僕は現在存在していない1つのディレクトリを作る役割なので、最初に指定されているvegetable/はただのパスで、最後に指定されたtomato/フォルを作れってことね!」 「あれ?vegetable/の道がそもそもないので工事車両を向かわせることできないです。。。」 mkdir vegetable/tomato *エラー* mkdir: vegetable: No such file or directory オプション オプション 利便性 説明 -p (--parents) ◎ 最後に指定したフォルダだけでなく、指定さえたパスのフォルダを全て作成してくれる -m (--mode) ○ 作成と同時に最後に指定したフォルダのパーミッションを同時に設定できる -v (--verbose) フォルダ作成の経過を表示する サンプル -p (--parents) 例1 先ほどNGパターンのvegetable/tomato/に-pをつけてみるとtomato/だけでなく パスで指定されている親ディレクトリのvegetable/も一緒に作成してくれます。 mkdir -p vegetable/tomato ちゃんと2つのフォルダが作成されているか確かめてみます。 tree vegetable *結果* vegetable └── tomato 例2 すでにvegetable/は存在し、中身もあります。その状態でvegetable/carrot/redのように指定してみます。 vegetable/は中身ごと上書きされることはありません。(tomatoフォルダはそのままです) そして、存在していないcarrot/とcarrot/の中身のredの合計2フォルダだけを追加で作成してくれます。 mkdir -p vegetable/carrot/red ちゃんと追加で2つのフォルダが作成されているか確かめてみます。 tree vegetable *結果* ├── carrot │   └── red └── tomato -m (--mode) 後日記述 -v (--verbose)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Asterisk】電話回線網であれの音楽を流してみた。+音質向上化も。

今回は誰得なんですがAsteriskを使って電話回線網に音楽を流してみました。 電話番号は【 05068792520 】です。通信量は各自ご負担ください。 とはいへ回線交換方式ではなくパケット交換方式のIP電話なんでLinuxがあれば簡単に作れます。 まぁ無理やりそれっぽく言うと擬似的なストリーミングみたいなやつですね。 実装方法 簡単にIP電話を構築する際に必要な予備知識を簡単に書いておきます。 イメージ図 簡単なDFD(DataFlowDiagram)みたいなみたくないな、、、まぁそんなもんです。 ネットワークでのパケットとして伝送するので既存のインフラで完結しコスト削減が図れます VoIPに関するプロトコル RTP IP電話(VoIP)を実現する技術としてパケット送信には、RTP(Real-time Transport Protocol)というシンプルなプロトコルが用いられます。 SIP SIPとはSession Initiation Protocolの略でシグナリングを行うプロトコルです。 RTPで音を送り合うためには、事前に相手との情報のやりとりが必要で、「電話」の機能を実現するためには、発信や着信、応答、切断といった「呼制御」と呼ばれる処理が必要になります。これを「シグナリング」または「呼制御」と呼び、SIPはそれを実現するためのプロトコルです。 なのでIP電話を使うにはFusion IP SMATalkや050plus,050freeなどのSIPプロバイダとの契約が必要です。 ※以上の内容は以下の記事にも書いてあります。 流す音楽 次に流す曲を決めます。といってもいろいろめんどくさい権利問題があるので、今回はアイドルマスターの家庭用版にあったTOWNっていう名前のBGM(俗に言うてってってーです)がニコニ・コモンズにあったのでそれを使います。 ※二次利用などの利用条件も遵守しています。 実践 050freeに登録 ブラステルイントラネットさんが提供しているSIPプロバイダの050freeを今回は使います。発信は有料ですが受信のみなら無料です。 SIPアカウント設定でIDとパスワードを取得。 音声データ変換 VoIPでは高音質での送信は難しいです。以下の要件があります。 サンプリング周波数:8000Hz 量子化ビット数:16bit モノラルステレオ不可! 相当音質は悪いですよね… 以下のコマンド一発で上記フォーマットで変換してくれます。 apt install sox sox voice.wav -r 8000 -c 1 voice_8k.wav Asterisk設定 aptでインストールするだけでOKです。 apt install asterisk 設定 以下のように設定ファイルを変更します。 sip.confでは接続情報を登録します。UserIDとPasswordは適宜置き換えてください。 /etc/asterisk/sip.conf [general] allowguest=no disallow=all allow=ulaw allow=gsm nat=auto_force_rport,auto_comedia ; Register register => UserID:Password@softphone.spc.brastel.ne.jp/100 [brastel] type=peer context=brastel host=softphone.spc.brastel.ne.jp 次にextensions.confで着信時の処理を書きます。PlayBackで音声ファイルを指定する際拡張子は省いてください! /etc/asterisk/extensions.conf [brastel] exten => 100,1,Answer exten => 100,n,PlayBack(/var/lib/asterisk/voice/voice_32k) これで設定完了。あとは systemctl restart asterisk で再起動したらつながるはず…です。 電話番号は05068792520 是非かけてみてください。10年前のXboxアイドルマスター感が味わえると思います。 音質向上 とはいえサンプリング周波数8000Hzなので超音質悪いです。 G.722のような、HDボイスと呼ばれる広帯域コーデックを使えば音質向上が図れます。 ここではサンプリングレートを8KHz→32KHzへ変換し、Asterisk の playback コマンドで流セル用改善します。 sox voice.wav -r 32000 -c 1 voice_32k.wav 拡張子は.sln32にしてさっきと一緒。HD Voiceに対応していれば若干高音質になります。 以上。 【ブログ】https://0115765.com/ 【Twitter】@tomox0115
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Asterisk】電話回線網で「あれ」の音楽を流してみた。+音質向上化も。

今回は誰得なんですがAsteriskを使って電話回線網に音楽を流してみました。 電話番号は【 05068792520 】です。通信量は各自ご負担ください。 とはいへ回線交換方式ではなくパケット交換方式のIP電話なんでLinuxがあれば簡単に作れます。 まぁ無理やりそれっぽく言うと擬似的なストリーミングみたいなやつですね。 実装方法 簡単にIP電話を構築する際に必要な予備知識を簡単に書いておきます。 イメージ図 簡単なDFD(DataFlowDiagram)みたいなみたくないな、、、まぁそんなもんです。 ネットワークでのパケットとして伝送するので既存のインフラで完結しコスト削減が図れます VoIPに関するプロトコル RTP IP電話(VoIP)を実現する技術としてパケット送信には、RTP(Real-time Transport Protocol)というシンプルなプロトコルが用いられます。 SIP SIPとはSession Initiation Protocolの略でシグナリングを行うプロトコルです。 RTPで音を送り合うためには、事前に相手との情報のやりとりが必要で、「電話」の機能を実現するためには、発信や着信、応答、切断といった「呼制御」と呼ばれる処理が必要になります。これを「シグナリング」または「呼制御」と呼び、SIPはそれを実現するためのプロトコルです。 なのでIP電話を使うにはFusion IP SMATalkや050plus,050freeなどのSIPプロバイダとの契約が必要です。 ※以上の内容は以下の記事にも書いてあります。 流す音楽 次に流す曲を決めます。といってもいろいろめんどくさい権利問題があるので、今回はアイドルマスターの家庭用版にあったTOWNっていう名前のBGM(俗に言うてってってーです)がニコニ・コモンズにあったのでそれを使います。 ※二次利用などの利用条件も遵守しています。 実践 050freeに登録 ブラステルイントラネットさんが提供しているSIPプロバイダの050freeを今回は使います。発信は有料ですが受信のみなら無料です。 SIPアカウント設定でIDとパスワードを取得。 音声データ変換 VoIPでは高音質での送信は難しいです。以下の要件があります。 サンプリング周波数:8000Hz 量子化ビット数:16bit モノラルステレオ不可! 相当音質は悪いですよね… 以下のコマンド一発で上記フォーマットで変換してくれます。 apt install sox sox voice.wav -r 8000 -c 1 voice_8k.wav Asterisk設定 aptでインストールするだけでOKです。 apt install asterisk 設定 以下のように設定ファイルを変更します。 sip.confでは接続情報を登録します。UserIDとPasswordは適宜置き換えてください。 /etc/asterisk/sip.conf [general] allowguest=no disallow=all allow=ulaw allow=gsm nat=auto_force_rport,auto_comedia ; Register register => UserID:Password@softphone.spc.brastel.ne.jp/100 [brastel] type=peer context=brastel host=softphone.spc.brastel.ne.jp 次にextensions.confで着信時の処理を書きます。PlayBackで音声ファイルを指定する際拡張子は省いてください! /etc/asterisk/extensions.conf [brastel] exten => 100,1,Answer exten => 100,n,PlayBack(/var/lib/asterisk/voice/voice_32k) これで設定完了。あとは systemctl restart asterisk で再起動したらつながるはず…です。 電話番号は05068792520 是非かけてみてください。10年前のXboxアイドルマスター感が味わえると思います。 音質向上 とはいえサンプリング周波数8000Hzなので超音質悪いです。 G.722のような、HDボイスと呼ばれる広帯域コーデックを使えば音質向上が図れます。 ここではサンプリングレートを8KHz→32KHzへ変換し、Asterisk の playback コマンドで流セル用改善します。 sox voice.wav -r 32000 -c 1 voice_32k.wav 拡張子は.sln32にしてさっきと一緒。HD Voiceに対応していれば若干高音質になります。 以上。 【ブログ】https://0115765.com/ 【Twitter】@tomox0115
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む