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