#143 Linux 文本处理:grep

2017-10-13

  • egrep = grep -E
  • fgrep = grep -F
# -G, --basic-regexp    基本正则, 默认
# -E, --extended-regexp 拓展正则
# -P, --perl-regexp     Perl 正则
# -w 完全匹配字词
# -x 完全匹配整行
grep catroll /var/log/auth.log
grep -E catroll /var/log/auth.log

# -F, --fixed-strings
grep -F catroll /var/log/auth.log

tail -1000 /var/log/auth.log | grep -Ev 'gnome-keyring-daemon|CRON'
  • -r 目录
  • -R 目录,处理软链
  • -v 排除
  • -i 忽略大小写 (ignore-case)
  • -m 控制匹配次数
  • -a 包含二进制内容的文件当作纯文本处理
  • -I 包含二进制内容的文件跳过

  • -b 输出命中内容的偏移量

  • -n 输出行号
  • -o 仅输出匹配部分
  • -h 不输出文件名(匹配多个文件时默认输出文件名 -H
  • -L, --files-without-match 仅输出没有匹配的文件名
  • -l, --files-with-matches 仅输出匹配文件名
  • -c, --count 仅输出文件名和匹配行数

  • --include=GLOB 只查找匹配 GLOB(文件模式)的文件

  • --exclude=GLOB 跳过匹配 GLOB 的文件
  • --exclude-from=FILE 跳过所有匹配给定文件内容中任意模式的文件
  • --exclude-dir=GLOB 跳过所有匹配 GLOB 的目录

  • -B, --before-context=NUM 打印文本及其前面NUM 行

  • -A, --after-context=NUM 打印文本及其后面NUM 行
  • -C, --context=NUM 打印NUM 行输出文本
  • -NUM 等同于 --context=NUM

#141 MySQL Boolean

2017-09-01

我们通常使用以下几种方式表示布尔值:

  1. tinyint(1)
  2. bit(1)
  3. enum('Y','N')

在 MySQL 中 bool, booleantinyint(1) 的别名。

如果只是一个 True OR False 的布尔型,没有比 bit(1) 更合适的了。
但是也有些时候,我们有好几个 bool 型用一个字段表示,最好用 bit(m),我也用过 int 型。

附:不同值的长度

Type Bit Byte Note
tinyint 8 1  
smallint 16 2  
middleint 24 3  
int 32 4  
bigint 64 8  
bit(m) m (m+7)/8  
binary[(m)]   m m 默认值:1
varbinary(m)   (m+1)  
tinyblob   (L+1) 1B 长度,最长 255B
blob[(m)]   (L+2) 2B 长度,最长 64KB - 1
mediumblob   (L+3) 3B 长度,最长 16MB - 1
longblob   (L+4) 4B 长度,最长 4GB - 1
enum('a',..)   1/2 最多可以存储 2^16 - 1 个值
set('a',..)   1/2/3/4/8 最多可以存储 64 个值

PS: blob 如果指定长度 m,MySQL 会选择足够存储数据的最小长度。
PS: MySQL set 类型

参考资料与拓展阅读

#140 数据库:应该怎么存储 IP 地址

2017-08-25

IP 地址的存储方式就两种:字符串,整型数。

表示方法

ipv4 VARCHAR(15) -- xx.xx.xx.xx
ipv6 VARCHAR(39) -- xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

ipv4 INT UNSIGNED
ipv6 BINARY(16)

-- 如果同时需要表达 IPv4 和 IPv6
ip VARCHAR(39)
ip BINARY(16)

PS:我还在有些地方看到过这种采用 12 位整数表示 IPv4 的方法:'192.168.0.1' => 192168000001, 如果存到 MySQL 的话,只能采用 BIGINTVARCHAR(12) 了。
如果省略中间的分号,ipv6 只需要 VARCHAR(32) 就行了。

整型和字符串的转换

  • INET_ATON / INET_NTOA
  • INET6_ATON / INET6_NTOA

#139 将文件当作磁盘

2017-08-05

dd if=/dev/zero of=cdata.img bs=1G count=5
mkfs ext4 -F cdata.img
LANG=en fdisk -lu cdata.img
sudo mount -o loop cdata.img /mnt/iso

sudo umount /mnt/iso

#138 EUI-64 地址

2017-08-03

相关文章:

一、概念

不知道为了什么,IEEE 设计了一个 64 位的地址方案,称之为 EUI-64 (Extended Unique Identifier)。
MAC 地址这种又被称之为 EUI-48,确切的说,应该是 MAC 地址是 EUI-48 格式。

目前已知的区别:

  1. MAC 地址的概念只存在二层计算机网络。
    而 EUI 不止被用于 IEEE 802 协议(局域网和城域网),可以用于其他类型设备,比如蓝牙。

TODO: 需要一些调查研究。

MAC To EUI64

就是在 OUI 和设备号之间插入 FFFE 即可。

xx:xx:xx:yy:yy:yy
xx:xx:xx:ff:fe:yy:yy:yy

二、场景

根据维基百科,

采用 EUI-48 格式的场景

  • IEEE 802 网络
    • 以太网
    • 802.11 无线网络(WIFI)
    • 蓝牙
    • IEEE 802.5 令牌环
  • 光纤分布式数据接口(FDDI)
  • 异步传输模式(ATM),仅作为NSAP 地址的一部分交换虚拟连接
  • 光纤通道(FC)和串行连接的 SCSI(SAS)
  • ITU-T G.hn 标准
    使用现有家庭布线(电力线、电话线和同轴电缆)创建千兆局域网。

采用 EUI-64 格式的场景

  • IEEE 1394 (FireWire),苹果公司和索尼、松下等公司开发的一种串行总线技术
  • InfiniBand,一种高性能网络标准(高吞吐,低延迟)
  • IPv6
  • ZigBee / 802.15.4 / 6LoWPAN
    PS: 6LoWPAN: IPv6 over Low-Power Wireless Personal Area Networks, 低功耗无线个人局域网 IPv6
  • IEEE 11073-20601

三、IPv6 中的应用

Update @ 2021-12-30

在 IPv6 的文档中频繁看到这个词。

无状态自动配置机制中:

  1. MAC 转 EUI-64
  2. U/L 位(首字节低二位)设位 1, 表示本地地址

#137 常见的时间格式

2017-07-24

日常使用

中国人习惯年月日时分秒,这可能也是一般符合国际通行规范的时间格式。

yymmdd
yyyymmdd
yyyy-mm-dd hh:mm:ss
yyyy/mm/dd hh:mm:ss

如果加上毫秒/微秒,在秒后面接上 ,SSS.SSS 就行。

但是由于英美的国际地位,以及由于历史原因而导致的英语的强势地位,英文国家的表述习惯也不能不考虑,

  • May 4, 1919 美式英语,读 may forth nineteen nineteen
  • 4 May, 1919 英式英语

用阿拉伯数字表示的话,可以用小数点、横杠、斜杠连接,数字可以用前导 0,
不过有一点很悲剧了,5/4/1919,如果不清楚上下文语境中的文化背景,谁 TM 知道应该算五四,还是四五。

Unix 时间戳

Unix Timestamp

又叫 Unix 时间(Unix Time),又叫 POSIX 时间(POSIX Time),又叫 Epoch Time。

以 UTC+0:00 1970/01/01 00:00:00 为起点,至今的秒数就是时间戳的值。

实际上我在很多项目中用到的时间戳都没有考虑时区,直接用当前系统默认时区的 1970/01/01 00:00:00 为起点,或者说是把当前时区时间当作零时区时间。

RFC2822

Internet Message Format, 邮件格式

date-time       =       [ day-of-week "," ] date FWS time [CFWS]
day-of-week     =       ([FWS] day-name) / obs-day-of-week
day-name        =       "Mon" / "Tue" / "Wed" / "Thu" /
                        "Fri" / "Sat" / "Sun"
date            =       day month year
year            =       4*DIGIT / obs-year
month           =       (FWS month-name FWS) / obs-month
month-name      =       "Jan" / "Feb" / "Mar" / "Apr" /
                        "May" / "Jun" / "Jul" / "Aug" /
                        "Sep" / "Oct" / "Nov" / "Dec"
day             =       ([FWS] 1*2DIGIT) / obs-day
time            =       time-of-day FWS zone
time-of-day     =       hour ":" minute [ ":" second ]
hour            =       2DIGIT / obs-hour
minute          =       2DIGIT / obs-minute
second          =       2DIGIT / obs-second
zone            =       (( "+" / "-" ) 4DIGIT) / obs-zone

1992/02/12 12:23:22+0800

Wed, 21 Jul 2017 10:35:00 +0000 (UTC)
Wed, 21 Jul 2017 18:35:19 +0800 (CST)
Wed, 21 Jul 2017 03:35:02 -0700 (PDT)
import time
import datetime

time.strftime('%a, %d %b %Y %H:%M:%S %z')  # local timezone
time.strftime('%a, %d %b %Y %H:%M:%S %z', time.gmtime())  # UTC

tz_e8 = datetime.timezone(datetime.timedelta(hours=8)) # +08:00
dt_e8 = datetime.datetime.now(tz_e8)
print(dt_e8)
print(dt_e8.strftime('%a, %d %b %Y %H:%M:%S %z'))

tz_w8 = datetime.timezone(datetime.timedelta(hours=-8)) # -08:00
dt_w8 = datetime.datetime.now(tz_w8)
print(dt_w8.strftime('%a, %d %b %Y %H:%M:%S %z'))

# dt_e8.strftime('%Y-%m-%d %H:%M:%S.%f')

ISO8601

约定了时间中各个部分的格式,比如年份应该采用四位数字,日期应该怎么表示,时间范围(比如一个月),循环时间,时间区间应该如何表示之类,是一份完整的时间相关规范。

对应的中国国家标准是 GB/T 7408-2005

比如我们要说的完整时间格式化就有几种允许的格式,下面就是常见的一种符合规范的表述:

YYYY-MM-DDThh:mm:ss+offset

例如:

2004-05-03T17:30:08Z
2004-05-03T17:30:08+08:00

其他

JavaScript 日期输出:

Sat Jul 24 2017 15:42:49 GMT+0800 (中国标准时间)

Python datatime 类型转字符串:

2017-07-25 12:09:39.123173+08:00

#134 ASCII 码表

2017-04-15

Bin Oct Dec Hex 缩写/字符 解释
0000 0000 0 0 00 NUL(null) 空字符
0000 0001 1 1 01 SOH(start of headline) 标题开始
0000 0010 2 2 02 STX (start of text) 正文开始
0000 0011 3 3 03 ETX (end of text) 正文结束
0000 0100 4 4 04 EOT (end of transmission) 传输结束
0000 0101 5 5 05 ENQ (enquiry) 请求
0000 0110 6 6 06 ACK (acknowledge) 收到通知
0000 0111 7 7 07 BEL (bell) 响铃
0000 1000 10 8 08 BS (backspace) 退格
0000 1001 11 9 09 HT (horizontal tab) 水平制表符
0000 1010 12 10 0A LF (NL line feed, new line) 换行键
0000 1011 13 11 0B VT (vertical tab) 垂直制表符
0000 1100 14 12 0C FF (NP form feed, new page) 换页键
0000 1101 15 13 0D CR (carriage return) 回车键
0000 1110 16 14 0E SO (shift out) 不用切换
0000 1111 17 15 0F SI (shift in) 启用切换
0001 0000 20 16 10 DLE (data link escape) 数据链路转义
0001 0001 21 17 11 DC1 (device control 1) 设备控制1
0001 0010 22 18 12 DC2 (device control 2) 设备控制2
0001 0011 23 19 13 DC3 (device control 3) 设备控制3
0001 0100 24 20 14 DC4 (device control 4) 设备控制4
0001 0101 25 21 15 NAK (negative acknowledge) 拒绝接收
0001 0110 26 22 16 SYN (synchronous idle) 同步空闲
0001 0111 27 23 17 ETB (end of trans. block) 结束传输块
0001 1000 30 24 18 CAN (cancel) 取消
0001 1001 31 25 19 EM (end of medium) 媒介结束
0001 1010 32 26 1A SUB (substitute) 代替
0001 1011 33 27 1B ESC (escape) 换码(溢出)
0001 1100 34 28 1C FS (file separator) 文件分隔符
0001 1101 35 29 1D GS (group separator) 分组符
0001 1110 36 30 1E RS (record separator) 记录分隔符
0001 1111 37 31 1F US (unit separator) 单元分隔符
0010 0000 40 32 20 (space) 空格
0010 0001 41 33 21 ! 叹号
0010 0010 42 34 22 " 双引号
0010 0011 43 35 23 # 井号
0010 0100 44 36 24 $ 美元符
0010 0101 45 37 25 % 百分号
0010 0110 46 38 26 & 和号
0010 0111 47 39 27 ' 闭单引号
0010 1000 50 40 28 ( 开括号
0010 1001 51 41 29 ) 闭括号
0010 1010 52 42 2A * 星号
0010 1011 53 43 2B + 加号
0010 1100 54 44 2C , 逗号
0010 1101 55 45 2D - 减号/破折号
0010 1110 56 46 2E . 句号
0010 1111 57 47 2F / 斜杠
0011 0000 60 48 30 0 数字0
0011 0001 61 49 31 1 数字1
0011 0010 62 50 32 2 数字2
0011 0011 63 51 33 3 数字3
0011 0100 64 52 34 4 数字4
0011 0101 65 53 35 5 数字5
0011 0110 66 54 36 6 数字6
0011 0111 67 55 37 7 数字7
0011 1000 70 56 38 8 数字8
0011 1001 71 57 39 9 数字9
0011 1010 72 58 3A : 冒号
0011 1011 73 59 3B ; 分号
0011 1100 74 60 3C < 小于
0011 1101 75 61 3D = 等号
0011 1110 76 62 3E > 大于
0011 1111 77 63 3F ? 问号
0100 0000 100 64 40 @ 电子邮件符号
0100 0001 101 65 41 A 大写字母A
0100 0010 102 66 42 B 大写字母B
0100 0011 103 67 43 C 大写字母C
0100 0100 104 68 44 D 大写字母D
0100 0101 105 69 45 E 大写字母E
0100 0110 106 70 46 F 大写字母F
0100 0111 107 71 47 G 大写字母G
0100 1000 110 72 48 H 大写字母H
0100 1001 111 73 49 I 大写字母I
0100 1010 112 74 4A J 大写字母J
0100 1011 113 75 4B K 大写字母K
0100 1100 114 76 4C L 大写字母L
0100 1101 115 77 4D M 大写字母M
0100 1110 116 78 4E N 大写字母N
0100 1111 117 79 4F O 大写字母O
0101 0000 120 80 50 P 大写字母P
0101 0001 121 81 51 Q 大写字母Q
0101 0010 122 82 52 R 大写字母R
0101 0011 123 83 53 S 大写字母S
0101 0100 124 84 54 T 大写字母T
0101 0101 125 85 55 U 大写字母U
0101 0110 126 86 56 V 大写字母V
0101 0111 127 87 57 W 大写字母W
0101 1000 130 88 58 X 大写字母X
0101 1001 131 89 59 Y 大写字母Y
0101 1010 132 90 5A Z 大写字母Z
0101 1011 133 91 5B [ 开方括号
0101 1100 134 92 5C \ 反斜杠
0101 1101 135 93 5D ] 闭方括号
0101 1110 136 94 5E ^ 脱字符
0101 1111 137 95 5F _ 下划线
0110 0000 140 96 60 ` 开单引号
0110 0001 141 97 61 a 小写字母a
0110 0010 142 98 62 b 小写字母b
0110 0011 143 99 63 c 小写字母c
0110 0100 144 100 64 d 小写字母d
0110 0101 145 101 65 e 小写字母e
0110 0110 146 102 66 f 小写字母f
0110 0111 147 103 67 g 小写字母g
0110 1000 150 104 68 h 小写字母h
0110 1001 151 105 69 i 小写字母i
0110 1010 152 106 6A j 小写字母j
0110 1011 153 107 6B k 小写字母k
0110 1100 154 108 6C l 小写字母l
0110 1101 155 109 6D m 小写字母m
0110 1110 156 110 6E n 小写字母n
0110 1111 157 111 6F o 小写字母o
0111 0000 160 112 70 p 小写字母p
0111 0001 161 113 71 q 小写字母q
0111 0010 162 114 72 r 小写字母r
0111 0011 163 115 73 s 小写字母s
0111 0100 164 116 74 t 小写字母t
0111 0101 165 117 75 u 小写字母u
0111 0110 166 118 76 v 小写字母v
0111 0111 167 119 77 w 小写字母w
0111 1000 170 120 78 x 小写字母x
0111 1001 171 121 79 y 小写字母y
0111 1010 172 122 7A z 小写字母z
0111 1011 173 123 7B { 开花括号
0111 1100 174 124 7C | 垂线
0111 1101 175 125 7D } 闭花括号
0111 1110 176 126 7E ~ 波浪号
0111 1111 177 127 7F DEL (delete) 删除