常用命令

查看内存占用

ps aux | grep soffice | grep -v grep | awk '{print $6/1024 " MB"}'

查看日志

查询 IP 信息,查找某条请求记录,然后打印出 IP 那一列,进行排序,再去重。可以得出请求的 IP 信息。

cat golog/20240905_ad.log |grep 'ad'|awk '{print $9}'|sort|uniq

从 IP 归属地库查询省份城市信息

cat ip.merge.txt |grep '河南省'|awk -v FS="|" '{print $5}'|sort|uniq

将行记录变成一行,并以逗号分割。

cat ip.merge.txt |grep '河南省'|awk -v FS="|" '{print $5}'|sort|uniq|paste -s -d ","

Awk

awk 是一种处理文本文件的语言,是一个强大的文本分析工具。

使用分隔符指定列:

awk -F',' '{print $1, $2}' file

打印满足条件的行数:

awk '/pattern/ {print NR, $0}' file

SCP 正则匹配复制文件

scp 可以使用正则复制文件,一次复制多个文件

scp -P 2222 \*.mp4 root@host:/data/upfile/

scp 还可以复制文件夹,使用-r 属性,递归复制,例如下面的格式:

scp -P 2222 -r 2023/ root@host:/data/upfile/

Sed

Linux sed 命令是利用脚本来处理文本文件。

将文件中的 oo 改为 kk

sed -i 's/oo/kk/g' testfile

将文件中的 ooo 去掉

sed -i 's/oo//g' testfile

删除行首空格

sed -i 's/^ //g' testfile

删除行尾空格

sed -i 's/ $//g' testfile

将 IP 前面的部分予以删除:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

在文件最后添加一行内容:

sed -i '$a # This is a test' regular_express.txt

开机自启服务

在 Windows10 上,使用 windows + r 键,调出运行,输入 shell:startup 进入开机启动项文件夹。新建文件:wsl.vbs,名字自定义,但必须使用 vbs 作为扩展名。

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu -u root /etc/init.d/ssh start", vbhide
ws.run "wsl -d Ubuntu -u root /etc/init.d/cron start",vbhide

查看默认的 WSL 名称

wsl -l

Mapfile

从标准输入或文件描述符读取行并复制给数组。

参数选项:

-d delim       将delim设为行分隔符,代替默认的换行符。
-n count       从标准输入中获取最多count行,如果count为零那么获取全部。
-O origin      从数组下标为origin的位置开始赋值,默认的下标为0。
-s count       跳过对前count行的读取。
-t             读取时移除行分隔符delim(默认为换行符)。
-u fd          从文件描述符fd中读取。
-C callback    每当读取了quantum行时,调用callback语句。
-c quantum     设定读取的行数为quantum。

如果使用-C时没有同时使用-c指定quantum的值,那么quantum默认为5000。
当callback语句执行时,将数组下一个要赋值的下标以及读取的行作为额外的参数传递给callback语句。
如果使用-O时没有提供起始位置,那么mapfile会在实际赋值之前清空该数组。

array(可选):用于输出的数组名称。如果没有指定数组名称,那么会默认写入到变量名为MAPFILE的数组中。

返回成功除非使用了非法选项、指定的数组是只读的、指定的数组不是下标数组。

下面是几个小示例:

# 常见的读取形式。
mapfile < source_file target_array
cat source_file |mapfile target_array
mapfile -u fd target_array

# 只读取前5行。
mapfile < source_file -n 5 target_array

# 跳过前5行。
mapfile < source_file -s 5 target_array

# 在数组指定的下标开始赋值。
# 请注意:这样做不会清空该数组。
mapfile < source_file -O 2 target_array

# 读取时设定行分隔符为tab。
# 注意,第二行的tab在终端需要用ctrl+v tab输入;
mapfile < source_file -d $'\t' target_array
mapfile < source_file -d '	' target_array

# 读取时移除行分隔符(tab)。
mapfile < source_file -d $'\t' -t target_array
# 读取时移除行分隔符(换行符)。
mapfile < source_file -t target_array

# 每读取2行,执行一次语句(在这里是echo)。
mapfile < source_file -C "echo CALLBACK:" -c 2 target_array

# 遍历下标,依次显示数组的元素。
for i in ${!target_array[@]}; do
  printf "%s" ${target_array[i]}
done

进程替换

在Linux的Bash脚本中,< <(command)的组合是进程替换的意思,表示将 command 的输出通过临时文件描述符重定向到前一个命令的输入。

例如:

cat < <(echo "Hello World")
# 等价于:echo "Hello World" | cat

其中,** <(command) ** 会生成一个临时文件描述符(如/dev/fd/63),其中包含command的输出,然后** < ** 将这个文件描述符的内容作为输入传递给前面的命令。

同理,> >(command) 可以将前面命令的输出通过管道传递给另一个命令:

例如:

# 将 ls 的输出传递给 grep
ls > >(grep "txt")

通过这种组合,你可以更灵活地在命令之间传递数据,避免管道 (|) 的某些限制(例如需要处理子 Shell 或临时文件)。