Linux shell命令使用案例小结

1. 获取目录名或文件名

# 列出当前目录,所有目录名,没有目录会报错
ls -d */ | xargs basename -a 
# 列出当前目录及子目录所有文件, f是文件,可以改为d,列出目录
find . -type f -print 

2. 清空文件内容

cat /dev/null > tmp.txt
# 等价于
:> tmp.txt
# 使用填充文件
dd if=/dev/zero of=~/zero   bs=1K    count=12

3. 备份数据

cp test.{txt,txt.bak}

4. 笛卡尔积

# 使用大括号生成file1:A file1:B file1:C file2:A file2:B file2:C file3:A file3:B file3:C
echo {file1,file2,file3}:{A,B,C}

5. 时间格式化

# Y:年,m:月,d:日,H:24小时制,I:12小时制,M:分,S:秒
date +%Y-%m-%d
# u:星期1-7,w:星期0-6, 0代表星期日

6. 文件某行添加内容

sed -i "17i content" file.txt

7. 获取端口进程情况

netstat -tunlp |grep <端口号>
ps aux | head -1;ps aux | grep <进程名字>

8. 命令输出丢掉

# &>/dev/null 等价于 >/dev/null 2>&1
ls &>/dev/null

9. 文件或目录是否存在,不存在则创建

[ -d <目录名> ] || mkdir <目录名>
[ -f <文件名> ] || touch <文件名>

10. 在脚本中,使用sudo自动输入root账户密码

echo "<root/password>"|sudo -S <code/want/to/run>

11. 在awk, sed中使用外部变量

# awk或者sed 引入外部变量 "'$var'" ,变量有空格"'"$var"'"
NICS=`echo $line | awk '{printf $1"'$SEP'"$2"'$SEP'"; for(i=3;i<NF;i++) printf $i" "; printf $NF"\n"}'`

12. 判断linux版本

# 查看centos版本
cat /etc/redhat-release
# 查看ubuntu版本
cat /etc/issue

13. 读取键盘输入

# -t 时间不超过秒数, -n 输入字符不超过 -p 提示字符串
read -t 10 -n 3 -p "please input your name:" name

14. 比较两个文件差异性

cmp file1 file2

15. 创建时写入文件

cat>mail-list<<-EOF
文件内容
文件内容
...
EOF

16. 读取文件行

for line in `cat 文件`
do
	echo $line
	...
done

while read line
do
  echo $line
done < 文件

cat 文件 | while read line
do
	echo $line
done

17. grep 完全匹配

grep -x bash

18. find 查找区分大小的文件

find . -size 14k # 查找当前目录下及子目录下大小等于14k的文件
find . -size -14k # 小于14k文件
find . -size +14k # 大于14k文件

19. 统计输出行数

ls -l | wc -l

20. 获取输出前几行或后几行

ls -l | head -2 # 前两行
ls -l | tail -2 # 后两行

21. <<<的用法

grep 123 <<< 345123
# 类似于
echo 345123 | grep 123
# <<< 用于将后面的内容作为前面的标准输入

22. shell打印字体颜色

# 夹在 "\e["和 "m"之间的数字
# 如果指定一个以上的数字,则用分号将它们分开
# 例如:"\e[31;42m"
# 第一个数字(31)为前景颜色(红色);第二个数字为(42)背景颜色(绿色)
# 通过\e[0m设为正常值
# 
颜色 字背景颜色代码 字颜色代码
40 30
41 31
绿 42 32
43 33
44 34
45 35
46 36
47 37
代码 效果
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m – \033[37m 设置前景色,见上面的表格
\033[40m – \033[47m 设置背景色,见上面的表格
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

23.判断一个命令是否存在

# 1. 使用which,据网络查找,有缺点:这是非shell内置命令,不同环境实现不同,使用$?判断可能失败
which wget
# 2. 使用command
command wget -h &> /dev/null

24.替换目录下所有文件中匹配的字符串

sed -iz 's/http:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/1.0.8\/angular.min.js/https:\/\/cdn.bootcss.com\/angular.js\/1.0.8\/angular.min.js/' `find . -type f -print0`

25.tar.xz文件解压到指定目录

# x 从压缩文件提取文件
# v 显示正在处理的文件
# J 可以处理 xz,lzip,lzma,
# f 使用文件
tar xvJf cron-4.1-65.tar.xz -C /
	

26.crontab定时任务

# 分 		时 		日 		月 		周 		命令
# [0-59]    [0-23]	[1-31]	[1-12]	[0-6]
* * * * * * date "+%Y-%m-%d %H:%M:%S"

27.tput 终端处理

28.Linux 录制和回放

# 开始录制
script -t 2>time.file -a output.file
...
# 结束录制
# 开始回放
scriptreplay time.file output.file

29.查看文件创建时间(Windows cygwin)

# linux不能查看,会输出-
stat -c %w tmp.sh

30.将文本文件每行逆序输出

rev file

31.find多文件 使用*要使用""包起来

32.获取脚本执行所在目录

$(cd `dirname $0`; pwd)

33.umask

umask
# 0022
# setUid/setGid/粘着位(sticky)、属主权限、组权限、其他用户的权限
# 通常用后三个
# 文件夹默认权限777,需要减掉022得到755
# 文件默认权限666,减掉022得到644

34.使用上条命令或参数

# 第一个参数
!:1
# 最后一个参数
!:$
# 上一条命令 不包括参数
!:0
# 或者
!#
!s以前用过的以s开头的命令,包括参数
!! 上一条命令,包括参数

35.计划任务

  • 一次性任务

    at now + 5 minutes   任务在5分钟后运行
    at now + 1 hour      任务在1小时后运行
    at now + 3 days      任务在3天后运行
    at now + 2 weeks     任务在两周后运行
    at midnight          任务在午夜运行
    at 10:30pm           任务在晚上10点30分
    at 23:59 12/31/2018   任务在2018年12月31号23点59分
    
    echo "wget www.baidu.com" | at tomorrow
    
    atq # 查看at任务列表,等价于at -l
    atrm 1 # 删除at中id为1的任务,等价于at -d 1
    
    
  • 长期性任务,见26

    crontab -e # 添加
    crontab -l # 查看
    

36.添加删除用户、组

useradd zhangsan 
adduser zhangsan # 会在home目录下建立一个同名文件夹,等价于useradd -m

userdel zhangsan
deluser zhangsan

groupadd QQgroup
addgroup QQgroup

groupdel QQgroup
delgroup QQgroup

gpasswd -a zhangsan QQgroup
gpasswd -d zhangsan QQgroup

37.给特定用户或用户组添加权限

# 加R可以设置目录
# 设置文件的用户或用户组的ACL权限
setfacl -m u:用户名:权限 文件名
setfacl -m g:用户组名:权限 文件名

# 删除文件指定用户或用户组的ACL权限
setfacl -x u:用户名 文件名
setfacl -x g:组名 文件名
# 删除文件所有ACL权限
setfacl -b 文件名

# 查看ACL权限
getfacl 文件名

38.获取本机外网地址

curl ifconfig.me

39.修改ubuntu主机名

修改/etc/hostname文件,将/etc/hosts加入一条

127.0.0.1 [修改后的主机名]

不加的话会在重启后一直出现unable to resolve host,然后reboot

40.iptables 用法

参考链接 https://www.cnblogs.com/metoy/p/4320813.html

41.echo 获取帮助文档

/bin/echo --help
man echo

42.nc 命令

  1. 查看端口
  2. 聊天服务器
  3. 发送文件

43.tshark.exe在windows下使用

要先用管理员身份启动net start npf,接着就可以使用tshark了

44.将制表符转化为空格

expand -t 10 file

45.查看某一个进程的实时CPU利用率

top -p `ps aux | grep -w mysql | grep -v grep | awk '{print $2}'`

46.Shell开启调试

#!/bin/bash -x

47.Shell异常退出

set -e #开启后任意一条语句返回值不为真就退出
set +e #关闭

48.markdownpad2写行内公式

\\(a+b\\)

49.stty size

50.sort用法

  1. -u 去除重复行
  2. -r 降序
  3. -o 结果输出文件
  4. -n/-g 按数字排序
  5. -t 设置间隔符
  6. -k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
    # 由逗号隔开,分为start和end两部分
    # modifier是选项部分,如b忽略前导空白、d字典序、f忽略大小写、i忽略不可打印字符、n 或 r
    # FStart 表示第开始排序的field位置,FEnd 表示结束field位置  从1开始
    # CStart 表示第开始排序的char位置,CEnd 表示结束char位置
    sort -t ":" -k1.2n,1.2
    

51.命令行ctrl组合快捷键

# 清屏
clear
# 分别代表把管标移动到最前和最后
# echo -e '\00X' 或者 echo $'\00X' X是十进制数 ctrl+A  echo -e '\001'
快捷键 效果
ctrl+a 光标移到行首
ctrl+b 光标左移一个字母, 向行首移动一个字符
ctrl+c 杀死当前进程
ctrl+d 删除光标之后的一个字符
ctrl+e 光标移到行尾
ctrl+f 光标右移,向行尾移动一个字符
ctrl+g 从逆向搜索模式退出
ctrl+h 删除光标前一个字符,同 backspace 键相同
ctrl+i 类似TAB健补全功能
ctrl+j 回车,相当于enter
ctrl+k 删除光标所在位置之后的所有字符
ctrl+l 清屏,相当于clear
ctrl+m 回车,相当于enter
ctrl+n 历史命令下一条命令,可用来查找
ctrl+o 回车,相当于enter
ctrl+p 历史命令上一条命令,可用来查找
ctrl+q 解锁屏幕,允许屏幕输出
ctrl+r 进入逆向搜索模式,搜索之前执行的命令
ctrl+s 锁定屏幕,阻止屏幕输出
ctrl+t 交换光标位置前的两个字符
ctrl+u 清除光标前至行首间的所有内容
ctrl+v 插入特殊字符,如在命令行输入tab ctrl+v tab
ctrl+w 移除光标前的一个单词
ctrl+x
ctrl+y 粘贴或者恢复上次的删除
ctrl+z 把当前进程转到后台运行,使用fg命令恢复。比如top然后ctrl+z,到后台,然后fg,重新恢复

52.cp出现提示

使用-rf无效还是出现覆盖提示,原因是使用了alias, cp实际为cp -i

\cp -rf test/*  test1/

53.添加用户进sudo组

vim /etc/sudoers 

# 或
sudo visudo
# 文件最后一行添加,这种情况下需要用户输密码
robin  ALL=(ALL) ALL
# 如果不需要用户输密码
robin  ALL=(ALL) NOPASSWD:ALL

54.接收信号,自定义信号处理

trap "echo '接收到信号SIGINT CTRL+C'" SIGINT
count=1
while [ $count -le 10 ]
do
	echo "循环 #$count"
	sleep 1
	((count++))
done
echo "结束"

55.复制一份文件n份

for((i=1;i<=16;i++)) do cp <文件名> <复制后文件名>$i; done

56.unzip解压强制覆盖

unzip -o file.zip

57.ssh远程登录

# 两台主机 
# 服务器:10.110.50.110 root
# 客户机: 10.110.50.240 ubuntu

# 先在客户机使用ubuntu登录,调用ssh-keygen,一路回车,在/home/ubuntu/.ssh下生成公钥id_rsa.pub和私钥id_rsa
ssh-keygen
# 再把id_rsa.pub上传到服务器上,添加到/root/.ssh/authorized_keys文件中,然后可以删除这个id_rsa.pub
cat id_rsa.pub >> authorized_keys
# 最后在客户机/home/ubuntu/.ssh下,使用ssh -i id_rsa [email protected]就可以免密码登录服务端了

# 原理
# 当客户机向服务器发出建立安全连接的请求时,首先发送自己的public key,如果这个public key是被服务器所允许的,
# 服务器就发送一个经过public key加密的随机数据给客户机,这个数据只能通过private key解密,
# 客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道

58.shell公共函数与自定义函数库

# 公共函数库位置
/etc/init.d/functions
# 也可以自定义自己的函数库

# 然后在自己调用函数库的执行一下
. /etc/rc.d/init.d/functions
# 或者
. /path/to/my/function/lib

# 就能调用函数库脚本中的函数了

59.将大写文件名转成小写

find . | awk '{low=tolower($1);cmd="mv "$1" "low;system(cmd)}'

60.单文件gcc编译

假设源程序文件名为test.c。

  1. 无选项编译链接
    用法:#gcc test.c
    作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

  2. 选项 -o
    用法:#gcc test.c -o test
    作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

  3. 选项 -E
    用法:#gcc -E test.c -o test.i
    作用:将test.c预处理输出test.i文件。

  4. 选项 -S
    用法:#gcc -S test.i
    作用:将预处理输出文件test.i汇编成test.s文件。

  5. 选项 -c
    用法:#gcc -c test.s
    作用:将汇编输出文件test.s编译输出test.o文件。

  6. 无选项链接
    用法:#gcc test.o -o test
    作用:将编译输出文件test.o链接成最终可执行文件test。

  7. 选项-O
    用法:#gcc -O1 test.c -o test
    作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长

61.恢复删除文件

  1. 参考博客
  2. df <目录名>
  3. 进入debugfs中执行open <df中file system>
  4. 执行ls -d /opt/fonsview/etc/ss
  5. 在显示结果中查找<>,找到删除的文件,记录之前的 <数字>
  6. 执行 logdump -i <数字>
  7. 在结果中找到Inode这一行,找到block 和offset 记录数字
  8. 退出debugfs,exit
  9. 执行 df if=文件系统 of=文件路径 bs=offset数字 count=1 skip=block数字

62.判断jar包是否损坏

unzip -t test.jar &> /dev/null
echo $?

63.字符串数组转命令

checkCammand="cat /sys/module/nf_conntrack/parameters/hashsize,\
cat /proc/sys/net/ipv4/tcp_tw_recycle,\
cat /etc/sysctl.conf |grep tcp_tw_recycle"
OLD_IFS=$IFS
IFS=","
checkCammandArray=($checkCammand)
IFS=$OLD_IFS
for((i=0;i<${#checkCammandArray[@]};i++))
do
	eval ${checkCammandArray[i]}
done

64.斜杠替换,将\替换为/

path=Users\root\Desktop\Card-Upgrade\card-upgrade-src\card-upgrade-server\src\main\java\com\fiberhome\synergy\upgrade\entity
echo ${path//\\//}

65.删除每行前两个数字和制表符

sed -i 's/[0-9]\{2\}\t' num.txt

66.查看进程中线程CPU利用率

top -Hp <进程id>

67.进制转换

# 10进制转16进制
printf %x 789
echo "obase=16;ibase=10;789" | bc
# 16进制转10进制
printf %d 0x315
echo "obase=10;ibase=16;315" | bc
echo $((0x315))
echo $((16#315))

68.复制多个目录下avi视频文件到上层目录

cp */*.avi .

69.jstack生成文件查看线程状态种类及数量

grep java.lang.Thread.State 6780.txt | awk '{print $2$3$4$5}' |sort | uniq -c
awk '/java.lang.Thread.State/ {print $2$3$4$5}' app.txt | sort |uniq -c
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章