0%

今天处理一个上百万行 csv 的文件,需要统计第二列大于 0 且小于 5 的行数,思来想去觉得用 shell 的 if 可以实现,但是需要多行代码,后来想到可以用 awk 命令来实现。

命令如下:

1
awk -F ','  '$2 > 0 && $2 < 5 { print $0 ;} ' user_data.csv | wc -l

通过 -F 和条件语句很方便的筛选 csv 数据,不再需要使用 Excel 来处理,大大节约了时间。

谨记。

例如替换

1
2
spring.redis.host=127.0.0.1
spring.redis.port=6379

1
2
spring.redis.host=192.168.1.1
spring.redis.port=6372

执行下边命令即可:

1
perl -i -p0e 's/spring.redis.host=127.0.0.1\nspring.redis.port=6379/spring.redis.host=192.168.1.1\nspring.redis.port=6372/s'

人罕小园芜,
虫多老树枯。
破壁遮阳冷,
野蒿伴影孤。
凫雁飞南北,
游子遍苦舒。
再回园中坐,
愿留不愿出。

江南烟雨濛濛时,
东风解相思。
梅落兰心,
竹拥棠臂,
梨花泪眼湿。

四海茫茫天涯老,
从来欢聚稀。
摇舟策马,
醉柳沉烟,
不待春暮迟。

tcpdump 是 linux 下最常用的抓包应用,这里记录下常见的用法和表达式语法。

常用命令

  1. 抓取某个网卡下的所有包:

    1
    tcpdump -i eth0
  2. 抓取来往 173.194.40.120 之间的所有包:

    1
    tcpdump host 173.194.40.120
  3. 抓取来往 173.194.40.120:80 之间的所有包,并不解析主机名和端口名

    1
    tcpdump -nn -i any host 173.194.40.120 and port 80
  4. 抓取来往 173.194.40.120:80 之间的所有包并展示 ASCII 码形式展示,且仅展示含有“User-Agent”的行

    1
    tcpdump -i any -A host 173.194.40.120 and port 80 | grep 'User-Agent'
  5. 以 16 进制方式展示抓取内容,

    1
    tcpdump -x
  6. 以 16 进制和 ASCII 码方式展示抓取内容

    1
    tcpdump -X

条件表达式

表达式决定了哪些数据包被捕获,表达式由一个或多个表达元组成,每个表达元通常由一个或多个修饰符 + id 组成。

常见的三种不同的修饰符 type、dir 和 proto。

type

修饰符指定 id 所代表的对象类型。

  • host 指定主机,如 www.baidu.com 或 127.0.0.1,如果 type 未设定,默认为 host
  • net 指定网络号 如 192.168
  • port 指定端口号
  • portrange 指定端口范围,如 8000 - 8008

dir

修饰符描述 id 所对应的传输方向。

  • src 传输源
  • dst 传输目的地
  • src or dst
  • src and dst

proto

修饰符描述 id 所属的协议。

可选协议:

  • ether
  • fddi
  • tr
  • wlan
  • ip
  • ip6
  • arp
  • rarp
  • decnet
  • tcp
  • udp

除以上所描述的表达元(‘primitive’), 还有其他形式的表达元, 并且与上述表达元格式不同. 比如: gateway, broadcast, less, greater 以及算术表达式,详情参考Linux tcpdump 命令详解

一些选项的介绍

  • -A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息)。

  • -c count tcpdump 将在接受到 count 个数据包后退出。

  • -n 不对地址进行数字到名字的转换。

  • -nn 不对主机、端口号、协议等进行数字到名字的转换。

  • -x 当分析和打印时,tcpdump 会打印每个包的头部数据,同时会以 16 进制打印出每个包的数据(但不包括数据链路层的头部)。

  • -xx tcpdump 会打印每个包的头部数据,同时会以 16 进制打印出每个包的数据,其中包括数据链路层的头部。

  • -X 当分析和打印时, tcpdump 会打印每个包的头部数据,同时会以 16 进制和 ASCII 码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便。

  • -XX 当分析和打印时,tcpdump 会打印每个包的头部数据, 同时会以 16 进制和 ASCII 码形式打印出每个包的数据,其中包括数据链路层的头部。

  • -t 在每行输出中不打印时间戳。

  • -tt 每行打印时间戳。(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成 1261798315)

  • -ttt 每两行打印之间会延迟一个段时间(以毫秒为单位)。

  • -tttt 在每行打印的时间戳之前添加日期的打印。

又见飞鸿点橙纹,
棹影动黄昏。
轻舟且住,
横笛未绝,
缓缓向城门。

昨日芳菲何处寻,
漫天落纷纷。
一曲新词,
两笺碎字,
潦草忧忧心。

月照故乡明,夜清风亦清。
长空星灿灿,旷野虫荧荧。
皎皎归家路,隐隐旧人声。
十载他乡客,久违儿时名。

月儿缺,
月儿圆,
风吹芭蕉人未眠。
独自忆流年。

故乡近,
故乡远。
十载倏忽如梦间。
惟念儿时天。

风雨落南溪,陌上水漓漓。
雾随芳草远,鸟共行人稀。
有家何京洛,无念即佳期。
徜徉心醉处,岂顾湿我衣。

月高悬,
叶翩翩,
南窗梢头正鸣蝉。
声断白云间。

莫贪欢,
前路难,
未及高处已觉寒。
秋霜又眼前。