常用命令
查看内存占用
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 或临时文件)。