地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Bash】sedの最短一致

$ echo "<aaa>b<ccc> <ddd>e<ccc>"

という文が会った時にbというのを取り出したいケースで以下のようにsedを使おうとするとb以外の不要な部分まで取れてしまう。

$ echo "<aaa>b<ccc> <ddd>e<ccc>" | sed -r 's/<aaa>(.*)<ccc>/\1/'
b<ccc> <ddd>e

これはsedが最短一致ではなく最長一致がデフォルトで機能するためでそしてsedには最短一致なるものが機能として存在しない。なので以下のように次の<の出現でパターンマッチをいったん終了させると言った処理を書く必要がある。これで最短一致が実現可能。

echo "<aaa>b<ccc> <ddd>e<ccc>" | sed -r 's/<aaa>([^<]*).*$/\1/'
b

特定タグの中身だけ欲しいみたいなケースで使える。

echo "<html>aaa</htm><tag>bbb</tag><test>ccc</test>" | sed -r 's/^.*<tag>([^<]*).*$/\1/'
bbb

【Linux】O_LARGEFILEフラグ

linuxjm.osdn.jp

O_LARGEFILEというフラグを見つけ気になったのでメモ。

O_LARGEFILE
(LFS) off_t ではサイズを表せない (だだし off64_t ではサイズを表せる)ファ イルをオープン可能にする。この定義を有効にするためには、(どのヘッダーファイ ルをインクルードするよりも前に) _LARGEFILE64_SOURCE マクロを定義しなければ ならない。 32 ビットシステムにおいて大きなファイルにアクセスしたい場合、 (O_LARGEFILE を使うよりも) _FILE_OFFSET_BITS 機能検査マクロを 64 に セットする方が望ましい方法である (feature_test_macros(7) を参照)。

open時にoff_tサイズを超えるサイズのファイルの場合に必要となるフラグ。

linux/fs.h at 29c395c77a9a514c5857c45ceae2665e9bd99ac7 · torvalds/linux · GitHub

で、定義しておけば大体2GBのファイルまで取り扱うことができる。

#define MAX_NON_LFS ((1UL<<31) - 1) # = 大体2GB

ただ、off_t自体が以下のようになっていて最近の64bitマシンだったらあまり気にしなくてもoff64_tが自動で使われるっぽい。32btiマシンを使う際にでかめのファイルを取り扱いたいケースとかで使えたりするんですかね?

    148 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
    149 typedef long     off_t;     /* offsets within files */
    150 #elif _FILE_OFFSET_BITS == 64
    151 typedef longlong_t    off_t;     /* offsets within files */
    152 #endif
    153 
    154 #if defined(_LARGEFILE64_SOURCE)
    155 #ifdef _LP64
    156 typedef   off_t      off64_t;    /* offsets within files */
    157 #else
    158 typedef longlong_t    off64_t;    /* offsets within files */
    159 #endif
    160 #endif /* _LARGEFILE64_SOURCE */

【Apache】http/2を試す

httpd.apache.org

この辺を参考に入れていく。CentOS7なら何もせずにビルドも成功したしモジュールも問題なく動いた。

<VirtualHost *:443>
    SSLEngine on
    
    <IfModule http2_module>
        ProtocolsHonorOrder On
        Protocols h2 http/1.1
    </IfModule>

    DocumentRoot "/var/https/example.com/htdocs/"
…(省略)…
</VirtualHost>

【Linux】ポートフォワードを使ってローカルのサービスを外部へ公開してみる

sshのリモートフォワードを使ってローカルで起動したサービスを外部からフォーワードする

# 以下を修正
$ vi /etc/ssh/sshd_config
GatewayPorts yes

# 再起動
$ systemctl restart sshd

以下のようにsshを起動することで192.168.1.1:8433へのアクセスが全てlocalhost:443へ繋がる。嬉しいケースとしてはlocalhostファイアウォールで守られているケースで他ユーザにサービスを確認してもらいたいケース。

$ ssh -R 8443:localhost:443 192.168.1.1

$ ss -antu | grep LIST | grep :8443
tcp    LISTEN     0      128       *:8443                  *:*
tcp    LISTEN     0      128    [::]:8443               [::]:*

www2.filewo.net