实用shell命令

on under linux
1 minute read

0x0 预备知识

  • 之所以能用到xargs这个命令,是由于很多命令不支持|管道来传递参数
  • ack中:
    • -r代表在当前目录的子目录中递归查找
    • -l代表列出符合匹配内容的文件名
    • -i代表在正则查找时忽略大小写
  • for用法: for each in $(command1);do command2;done
  • find中:
    • 正则查找文件名时查找的文件名是包含完整路径的,也即正则表达式要匹配完整路径
    • macOS下的正则查找文件名和普通linux下的正则查找文件名用法不同
      • macOS中正则查找文件名用法为find -E . -regex "正则"
      • 普通linux中正则查找文件名用法为find . -regextype posix-extended -regex "正则"
    • find查找时不想显示Permission denied的信息可这样find ... 2>&1 | grep -v "Permission denied"
    • find正则查找文件名时忽略大小写用法为:将-regex替换成-iregex
  • 2>&1中:
    • 0,1,2分别代表标准输入,标准输出,标准错误
    • >&1的写法是为了区别>1这个重定向到文件名为1的文件,>&1表示重定向到标准输出
    • find命令查找文件名时会在终端中显示标准输出和标准错误的信息,也即find ... == find ... 2>&1
    • find命令遇到没有权限的文件会显示权限不足,显示权限不足的信息是标准错误
    • 2>/dev/null的功能是将标准错误重定向到/dev/null
    • python3 xx.py > xx.log 2>&1python3 xx.py > xx.log表示默认的”1”(标准输出)的内容重定向到xx.2>&1表示标准错误输出重定向到标准输出,但是由于标准输出已经有个规则(重定向到xx.log),所以有了2>&1的效果是标准错误也会重定向到xx.log如果一个任务运行时间比较久可这样运行:setsid python3 xx.py > xx.log 2>&1这样表示在后台运行,且将运行中的标准输出与标准错误记录到xx.log,这样方便定位进度和异常
  • grep -v-v表示查找不匹配的

0x1 Items

1.查找当前目录下包括子目录内所有的包含’def’字符串的python文件,并删除这些文件

find . -name "*.py" | xargx ack -ri 'def' | xargs rm
或者
for file in $(find . -name "*.py");do ack -il 'def' $file && rm $file;done
或者
for file in $(find . -name "*.py" | xargs ack -li 'def');do rm $file;done
或者
for file in $(find . -name "*.py");do ack -il 'def' $file;doen | xargs rm

2.查找当前目录下包括子目录内所有的临时文件(.swp,.swm,.swn,.swo等,但不包括.swf),并删除这些文件

macOS下:

find -E . -regex ".+\.sw[^f]$" 2>/dev/null | xargs rm
或
find -E . -regex ".+\.sw[^f]$" | grep -v "Permission denied" | xargs rm
或
find -E . -regex ".+\.sw[^f]$" 2>&1 | grep -v "Permission denied" | xargs rm


普通linux下:
find . -regextype posix-extended -regex ".+\.sw[^f]$" | grep -v "Permission denied" | xargs rm

3.将godseyedb数据库中的targets表名中的所有可以匹配’.*scaned$’正则的列名所在的列的值全部修改为’0’

for colname in $(mysql -uroot -proot -e "select column_name from information_schema.columns where table_name='targets' and column_name regexp '.*scaned$'" | ack '\S+scaned$');do mysql -uroot -proot -e "use godseyedb;update targets set $colname='0'";done
或者
for colname in $(mysql -uroot -proot -e "use godseyedb;desc targets" | ack -o '\S+scaned(?=\s)');do mysql -uroot -proot -e "use godseyedb;update targets set $colname='0'";done
shell
home
github
archive
category