shell疑难杂症

一、shell疑难杂症

  一)命令

  1、find命令

  find 命令一直都是系统管理员的常用命令之一, 其参数中 “-exec” 尤其实用。而 “xargs” 命令,针对查询也有属于自己的见解。本文着重讲解的是围绕 find 命令查询为主线,使用 -exec 参数(find 命令) 或使用 xargs 命令

  https://www.cnblogs.com/itxdm/p/5936907.html

    1、批量重命名查找到的文件名

  解释:

  • -exec 后面接复杂的命令时,使用sh -c 'command' {} \;
  • 有变量时,需要使用 “-”,“_”,“/”特殊字符占位,使用特殊字符的数量和变量的数量保持一致
find . -name "*.md" -exec sh -c 'mv "$1" "${1%.md}.html"' / {} \;

  2、/bin/sh -c的必要性

  问题

$ sudo echo “hahah” >> test.csv
-bash: test.asc: Permission denied

  解决办法:

第一种方法:利用 “sh -c” 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:
$ sudo /bin/sh -c ‘echo “hahah” >> test.asc’

另一种方法:利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:
$ echo “hahah” | sudo tee -a test.asc
注意,tee 命令的 “-a” 选项的作用等同于 “>>” 命令,如果去除该选项,那么 tee 命令的作用就等同于 “>” 命令

   3、抓取指定时间段和关键词的内容

  实现:尽量让目标文件尽可能小,而且源文件可以是存在不同目录下的多个文件

  1. 首先抓取指定关键词的,然后将抓取的内容重定向到一个临时文件中(源文件可以是多个,也可以在嵌套目录中)
  2. 然后,截取指定时间段的日志内容,重定向到结果文件中
第一步:抓取含有关键词的内容行,重定向临时文件
若抓取单个关键词,可以使用grep,如下
grep -R "关键词" taskmanager.log* > tmp.log

若抓取多个关键词,使用egrep,如下
grep -R "关键词1||关键词2" taskmanager.log* > tmp.log

第二步:截取临时文件指定时间段的内容,重定向到结果文件中

方法1.grep使用,最简单的方式
命令: grep '时间' '日志文件名 '
grep "2022-06-26 23:5[0-9]" tmp.log >  result.log
抓取10分钟的日志


方法2.sed使用 (建议使用,避免复杂的时间匹配问题)
sed -n '/2022-06-26 23:05:07,567/,/2022-06-27 22:45:31,667/p'     tmp.log >  result.log

开始时间和结束时间都要在日志文件中有对应时间一条记录存在,
开始时间没有截取不到任何内容,结束时间没有会截取到整个日子结尾的内容

  3、删除乱码文件

????_#QW1W???u

  使用rm -rf 无法删除此文件

  通过inode删除文件

1、使用 ls -i 查看这个文件的Inode
2find -inum 删除文件ID号 -delete

 

  二)k8s多集群管理kubectl命令问题

  1、kubectl patch 扩、缩容pod数

#!/bin/bash
KubeConfig_name=${KubeConfig_name}
#Deployment_Name=${Deployment_Name}
# 下面两个变量先写成固定值,验证 Deployment_Name
=nginx-deployment Namber=2 #ACD={\"spec\":{\"replicas\":$Namber}} echo $KubeConfig_name for line in ${Deployment_Name} do cd /root/.kube pwd #source /etc/profile
#kubectx 多集群管理命令 #kubectx $KubeConfig_name
echo $KubeConfig_name echo $ACD #kubectl patch deployment ${line} -p ${ACD}
# -p 后面不加单引号'',执行shell时,会默认加上 kubectl
patch deployment ${line} -p {\"spec\":{\"replicas\":$Namber}} #kubectl patch deployment ${line} -p '{"spec":{"replicas":2}}' sleep 35 done

  执行如图:

  

  三)普通用户在有权限的目录下,操作删除rm没提醒(直接删除了文件)

  1、问题描述:

  默认情况下:普通用户在有权限的目录下,操作删除rm没提醒(直接删除了文件);但是root用户是有提醒的

  root用户操作示范

  

 

  普通用户操作示范

  

  2、出现这个现象的原因

  在root用户下有rm对应别名,在普通用户没有rm别名

  root用户/root/.bashrc有别名,文件如下 

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

  普通用户/${USER}/.bashrc没有别名,文件如下 

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

  3、解决方法(root用户在全局设置:/etc/bashrc )

sudo su -
cat <<EOF >> /etc/bashrc
# alias
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
EOF
source /etc/bashrc

 

posted @ 2022-04-13 13:39  思维无界限  阅读(133)  评论(0编辑  收藏  举报