BASH command stander sample
一些日常用到的bash语句做记录
系统
strace 追踪调试工具
strace -e open -ostrace.out /usr/sbin/sshd
# expr:
strace -f -e trace={open,close,read,write,file,process,network,signal,ipc} -p $PID -o {将跟踪输出写入文件名而不是stderr}
# 限定表达式,用于修改要跟踪的事件或如何跟踪它们:
strace -e expr
# 仅跟踪指定的系统调用集。该-c选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。
strace -e trace=set
# 跟踪所有以文件名作为参数的系统调用。
strace -e trace=file
# 跟踪涉及过程管理的所有系统调用。这对于观察进程的派生,等待和执行步骤很有用。
strace -e trace=process
# 跟踪所有与网络相关的系统调用。
strace -e trace=network
# 跟踪所有与信号相关的系统调用。
strace -e trace=signal
# 统计每一系统调用的所执行的时间,次数和出错的次数等。
strace -c uptime
# 显示有关标准错误的strace本身的一些调试输出。
strace -d
# 在系统调用时打印指令指针。
strace -t
# 按指定条件对-c选项打印的直方图输出进行排序。
# 示例:打印执行uname系统调用中calls的次数排序
strace -fc -S calls uname
shell
shell变量截取
#shell变量的截取
Shell中的${}、##和%%
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
//变量的删除
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
//变量的替换
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
${LINE%%*}的意思就是从LINE这个变量的值中,从后面开始以最长匹配删去%%后面的表达式内容。
看一下man bash可以找到详细说明,查找Parameter Expansion这段会看到:
${parameter%word}
${parameter%%word}
都是从parameter的最后开始删除word所匹配的内容,%是最短匹配,%%是最长匹配。
批量停止进程
ps aux | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9
从第500+行开始读
tail -n +500
预读SQL文件时过滤特定数据
unzip -p ./mysql_db_week0_03.zip mysql_db_week0_03.sql | grep -e 'INSERT INTO `TABLE_NAME`' -e 'INSERT INTO `TABLE_NAME`' | mysql -p plasma
替换特定字段
sed -ri.bak 's/^(LIMSADDRESS=http:\/\/).*.(:8080\/CommonService\.asmx)/\1VALUE\2/' ./REPLACE_FILE
替换CR控制字符
sed -i "s/\r//g"
# 删除行
sed -i -e '/^export JAVA_OPTS/d'
注释特定
sed -i 's/^thread_concurrency/s/^/#/g' /etc/my.cnf
sed提取模式
# 检查密码
sed -ne /^PASSWD/p ./scripts/plasma_bak.sh
# 替换密码
sed -i 's/^\(PASSWD\).\(.*\)/\1=\"\2\"/' ./scripts/plasma_bak.sh
sed -i 's/^\(PASSWD\).\(.*\)/\1=\"NEWPASSWORD"/' ./scripts/plasma_bak.sh
sed替换引号
sed $'s/\'//g'
sed $'s/\'//g"'
sed "s/[\'\"]//g"
sed "s/[\x27\x22]//g"
sed $'s/[\'\"]//g'
sed打印行号
echo 123 | sed -ne '/^123/{=,p}'
sed匹配括号消除
who -u am i | awk '{print $NF}' | sed 's/[()]//g'
添加sudoers
sed -i '/^#.*Allow root to run any commands/ arouting\tALL=\(ALL\)\tALL' /etc/sudoers
History指定日期格式和记录数量
export HISTSIZE=4096
# 设置history时间显示格式
DT=`date "+%Y-%m-%d_%H:%M:%S"`
# 指定history日志路径
export HISTFILE="/usr/operation/${LOGNAME}/${USER_IP}/$DT"
# 设置文件权限
chmod 600 /usr/operation/${LOGNAME}/${USER_IP}/** 2>/dev/null
find片段
find ./ -type f -printf '%T+ %p\n' | sort -r | head -n 10
预读SQL文件时排除特定数据
unzip -p ./mysql_db_week0_03.zip mysql_db_week0_03.sql | sed -e '/^INSERT INTO `TABLE_NAME` VALUES/s/^/#/' -e '/^INSERT INTO `t_bims_donor_id_photo` VALUES/s/^/#/' | mysql -p plasma
网络
网卡闪烁
ethtool -p eth0 10
tcpdump错误消息“该设备不支持监控模式”
tcpdump -L -i eth0 # 拿到类型列表
tcpdump -y EN1000MB -i eth0 # 指定可用类型
磁盘
磁盘坏道检测badblocks
badblocks命令详解
Linux badblocks命令用于检查磁盘装置中损坏的区块,执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。
语法
badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]
参数说明:
-b<区块大小> 指定磁盘的区块大小,单位为字节。
-o<输出文件> 将检查的结果写入指定的输出文件。
-s 在检查时显示进度。
-v 执行时显示详细的信息。
-w 在检查时,执行写入测试。
[磁盘装置] 指定要检查的磁盘装置。
[磁盘区块数] 指定磁盘装置的区块总数。
[启始区块] 指定要从哪个区块开始检查。
通过命令扫描硬盘
# badblocks -s -v /dev/sda
向端口发送测试数据
# 1,向本机/本地的10000端口发送udp数据:
echo “udp_test” > /dev/udp/localhost/10000
# 2,向远程/其他服务器发送udp数据:
echo “udp_test” | socat - udp4-datagram:IPADDRESS:PORT
Curl
文件上传
curl -X POST -F "file=@/path/to/file" http://url
文件输出
curl http://url --output -
发送Json
curl http://url \
--head 'Content-Type: Application/json' \
--data '{"key": "value"}' \
-X POST