kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

html url 编解码,特殊字符等

https://blog.csdn.net/qq_38766930/article/details/123703178

+、空格、=、%、&、#等字符

urlencode rawurlencode

https://www.jianshu.com/p/99c09270ad52

其实对于URL编码,rawurlencode才是标准,它定义在 RFC3986 上,这个 RFC 描述了如何定义一个 URL,URL 其实本质上不是 HTTP 协议的一部分,只是 URL 和 HTTP 协议结合的比较紧密,所以总觉得 HTTP 协议包含 URL。

先描述下rawurlencode,它也叫做百分号编码(Percent-encoding),首先思考一个问题,为什么URL需要编码,原因就在于早期的 URL 只有 ASCII 字符,所以无需编码。

但世界上有多种语言,为了让 URL 符合语义标准,必须转码,主要有以下几种字符需要编码:

1
2
3
4
ASCII 控制字符。
Non-ASCII,比如中文字符。
保留字符,比如/符号有特殊含义,为了输出原始/符号,必须编码。
不安全字符,这些字符(比如<、\、%)应该可以称为“应用字符”,对应的就是 HTML 中的“实体字符”。

那么具体如何编码呢?

1
2
3
非字母和数字字符替换为%符号,后面跟着字符的十六进制。
破折号、下划线、点号和波浪号无需编码。
空格替换为%20。

接着说说urlencode,它基于rawurlencode标准,但有略微的不同,它定义在rfc1866,这个rfc属于html标准的一部分,编码方式和 application/x-www-form-urlencoded MIME 编码方式一致。

urlencode处理 query string 的编码,而 rawurlencode 被认为处理 url 编码,这可以看做一个区别。

urlencode 和 rawurlencode 在编码方式上有二处区别:

1
2
波浪号需要百分号编码。
空格替换为+。

那么为什么不能保持一致呢?可能是历史原因,但 rfc2396 认为 url 中的 + 符号是一个保留字符,所以 rawurlencode 编码方式更标准。

PHP htmlspecialchars() 函数

https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

1
2
3
4
5
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

https://blog.csdn.net/YungGuo/article/details/110197818

apache log 中,参数之前的url是 \x , 参数是 %

例如

1
index/\xe6\x89\xa7\xe8\xa1\x8c\xe7\xbb\x93\xe6\x9e\x9c\xe5\xa6\x82\xe4\xb8\x8b?arg=%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%A6%82%E4%B8%8B

%

如果是 % 直接用 urldecode

1
urldecode($v);

\x

1
2
 \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c
 中文是: 你好世界

上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。

这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。

可能有人会说,既然得到的是utf-8编码,在前面加上 “ b ” ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢?

答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 “ \x ” 改为 “ % ” 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。

1
urldecode(preg_replace('/\\\x([0-9a-fA-F]{2})/', '%$1', $v));

url 中 \xe6 %E6 两种解码方式

https://blog.csdn.net/YungGuo/article/details/110197818

apache log 中,参数之前的url是 \x , 参数是 %

例如

1
index/\xe6\x89\xa7\xe8\xa1\x8c\xe7\xbb\x93\xe6\x9e\x9c\xe5\xa6\x82\xe4\xb8\x8b?arg=%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%A6%82%E4%B8%8B

%

如果是 % 直接用 urldecode

1
urldecode($v);

\x

1
2
 \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c
 中文是: 你好世界

上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。

这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。

可能有人会说,既然得到的是utf-8编码,在前面加上 “ b ” ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢?

答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 “ \x ” 改为 “ % ” 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。

1
urldecode(preg_replace('/\\\x([0-9a-fA-F]{2})/', '%$1', $v));

grep如何匹配制表符

https://www.iteye.com/blog/xulu010-2412401

1
cat 1 | grep '1\t2'

因为,‘\t’里的\会被认为是转义字符,只能匹配到‘1t2’这样的字符串

那要怎样匹配呢,两个方案

1.手动把制表符打出来

1
cat 1 | grep '1 2'  

制表符的打法是ctrl-v + tab

2.使用$符号展开\t

1
cat 1 | grep '1'$'\t''2'  

$符号在shell中是引用变量的意思,所以 $‘\t’ 就是返回了一个展开的制表符

如果要匹配多个制表符,使用+号匹配即可

1
cat 1 | grep '3'$'\t''\+4'