1)echo
-n newline 不打印尾随的换号;
-e 转义字符打印;
name=xx
echo $name
echo $? //打印上一个命令的退出状态码
echo '$hello' //单引号''在shell里面是强引用;
命令"ll \"中的'\'是续行符;
echo \n 中,'\'当续行符了;
echo -e escape 转义字符打印,例如:echo -e "hello\nworld"
echo -e "\e[1;31;43mhello world\e[0m" //SGR序列打印;
2)find
find . -iname "*.txt" //忽略大小写,比如1.txt,2.TXT都可以找到
find . -type f //查找普通文件,类型找
find . -m[-a,-c]min -1 //根据时间查找 //文件的3中时间:访问时间 access time;modify time 修改时间;变更时间 change time;
3)mkdir
mkdir aaa bbb ccc //在当前目录下创建3个目录
mkdir -p mm/nn/xx //递归创建多个目录
mkdir -pv aa/bb //循环创建目录,并打印创建信息 v = verbose
mkdir -m 700 aaa //创建目录时,指定其权限 x:1 w:2 r:4
4)cp
cp -v readme readme2 //在复制的过程中,打印详细信息
cp -r test1 test2 //复制目录
cp -i readme readme1 //已有readme1文件, 当复制时会询问是否覆盖,'n',不覆盖,'y',覆盖;
cp -f readme readme2 //目标文件存在,强制赋值
5)cat
cat: concatenate 美[kɑnˈkæt(ə)ˌneɪt] 连接的意思; squeeze 美 [skwiːz] 挤压
cat -n file //显示文件行号
cat -b file //只统计文本内容多少行
cat -s file //合并空行 s squeeze
6)wc 计数命令 word count
wc -m test.txt //只计算字符数; -c 计算字节数;-l 计算行数;-w 计算字数;
7)tar
注意:这个'f'必须放到最后,其他的可以随便写;
tar -cf test.tar testdir/ //c:压缩文件命令,f是压缩文件的名称;
tar -xf test.tar //在当前目录下解压 x:解压文件命令
tar -zcf test.tar.gz testdir/ //按gz格式压缩
tar -zxvf test.tar.gz //按gz格式解压,并打印解压的详细信息(列出文件名);
8)tail 查看文件内容的另一个命令工具,【日志神器】
从后往前打印文件内容,默认打印10行数据;
tail -n 5 test1.txt //指定后5行打印; +5:从第5行打印到末尾;
-f,持续的监控一个文本文件,这个是最重要的,例如:
tail -f test.log //持续监视这个文件,并输出新增加的内容
tail -F test.log //类似于-f,但是文件(如test.log)丢失后,会从新创建文件;
9)vim使用
gg 命令跳行首,G:行尾;
在命令行模式中 /find:向下搜索,?find 向上搜索;
10)grep 查找文本命令
grep xxx test.txt //在test.txt文件里面,查找xxx文本
grep -i xxx test.txt //忽略大小写
grep -w hello test.txt //精确匹配
grep -e hello -e today test.txt //查找hello和today字符
grep -n hello test.txt //查找hello文本在test.txt所在的行数
grep -E 'long_option|NULL' hmain.c //-E 启用正则表达式,查找long_option或者NULL的文本;
grep -r return ./* //在当前目录下,查找所有文件中包含return的【文本】;
grep -l write ./* //在当前目录下,查找所有文件中包含write的【文件】;
11)sed(编辑和处理文本的工具) append insert change delete substitute print
nl sed命令
sed [选项][脚本][输入文件]
stream editor的缩写,是流编辑器,逐行处理一个文件;substitute 取代;
sed -e '1i\aaa' test.txt //在第一行插入一个aaa, //''里面是脚本表达式; -e express:是内容
sed -ie '1i\aaa' test.txt //会在test.txt文件中的第一行插入一个aaa,并生成另一个文件;
sed -i '1i\aaa' test.txt //同上,但不会生成新的的文件;
sed -i '4d' test.txt //删除第4行;
sed -ie '1s/new/old/g' test.txt //把第一行所有的new替换为old,如果没有1,则代表整个文件;
12)管道 ‘|’
管道是连接多个命令,然后把前面命令的标准输出作为后面命令的标准输入来使用;
例如:cat test.txt | wc -l //统计有多少行
管道只会传递标准输出,而不会传递标出错误输出!
13)输出重定向’>’
在'>'中,相当于'1>',是标准输出;
cat test.txt | grep tt > tmp.log //查找有tt的文本,并重定向写到tmp.log文件里面,(会覆盖原有的内容)
cat test.txt | grep mmm >> tmp.log //追加内容
cat test.txt 2> tmp.log //标准错误输出重定向
cat test.txt test2.txt > tmp.log 2>&1 //标准输出和标准错误输出后面绑定,都输出到tmp.log里面,(假使text2.txt文件没有)
14)输入重定向’<’
作用是修改我们的输入来源;
只输入一个"cat"命令,把标准输入转换为标准输出;
cat < [文件名] //将文件内容作为标准输入;
cat < test.txt //把文件test.txt输入到cat里面,cat通过标准输入转换为标准输出,打印出来;
cat << EOF //输出结束(EOF这个文件结束标志可以随便指定,一般都是EOF)
常用法:输入重定向和输出重定向结合起来使用;
cat > t2.txt << EOF //假使t2.txt不存在,则标准输出后,会创建t2.txt文件,输入文本后,当输入“EOF”退出文件编辑;
15)printf
print会自动打印换行符,而printf不会自动打印换行符,但会格式化输出;
单引号和双引号的区别:
单引号是直接打印,双引号是可以解析"$var"变量的内容的;
printf "\e[5;31m$name\n\e[0m" //格式化输出,颜色打印
printf "%-5s %5s\n" "hello" "world" //左对齐是有'-',右对齐是没有'-';
16)awk学习
grep擅长的是查找,sed擅长的是替换,awk擅长的是格式化处理文本;
awk也是一款流编辑器:就是逐行的读取并处理文件,直到把整个文件处理完成;
在文本中,一行叫一个record[记录],每一行有好多字段(用空白符分割的单词),分别用$1,$2,$3....等区别;
awk用法:awk [] '' [] //第一个[]是操作选项,''是我们的脚本,第二个[]是我们要处理的文件名;
awk '{print $1}' t1.txt //打印t1.txt文本的第一字段内容(没有用到操作选项)
awk '{print $NF}' t1.txt //打印t1.txt文本的最后一个字段内容 NF = number of field;
awk -v OFS="#" '{$1=$1;print $0}' t1.txt //
FS和OFS的区别;
awk 'NR==5{print $0}' t1.txt //打印第5行数据;
awk '/df/{print $0}' t1.txt //正则表达式,打印有"df"的字符串;
runaway 美 [ˈrʌnəweɪ] 失控的;
awk常用参数
-v value 设置变量
-F filed separator 输入字段分隔符;
awk常用内置变量
$[n] number 第n个字段
$0 当前整条记录
FS filed separator 输入字段分隔符;
RS record separator 输入记录分隔符;
OFS output field separator 输出字段分隔符;
ORS output record separator 输出记录分隔符;
NF number of field 当前记录包含字段数;
NR number of record 当前已处理记录数;
awk的内置函数
awk '/b/{print index($1,"b")}' t1.txt //返回字段'b'所在的列数位置
awk '/b/{print length($1)}' t1.txt //返回字段'b'的长度
模式+操作,其中,'/b/{print length($1)}'叫模式语句块,其中模式和操作允许有其中任何一个,或者同时有都可以;
awk '/b/' t1.txt //只支持模式匹配
awk '{print $1}' t1.txt //只支持操作
awk的BEGIN语句和END语句的使用;
awk 'BEGIN{printf "%5s %5s %5s\n","语文","数学","英语"}{printf "%4s %4s %4s\n",$1,$2,$3}' t1.txt
16)touch
touch 1.txt 2.txt //创建多个文件
touch {1..10}.log //创建10个文件
修改时间属性 三个时间属性 stat file.txt
17)xargs(参数转换器),是extended arguments的缩写;
作用:就是把其他命令的给它的数据,传递给后面的命令作为参数;
-d[分隔符] delimiter 指定输入分隔符
-n[数字] number 指定每次传递给命令的参数个数
-p prompt 执行命令之前先打印完整命令并询问是否执行
-t 执行命令前先打印完整命令
-l[占位符] 指定占位符,在占位符处使用参数
-r no run if empty 如果传下来的参数为空,则不执行后面的命令;
需求:要在一堆文件中,去找文件内容,是否有"apple"的内容
find + grep + 管道符 + xargs的使用
find ./ -name "*.log" | xargs grep "abc" //说明:find ./ -name "*.log"找到的是一堆文件名,把每个文件名作为参数给grep;
find . -iname "*.txt",会找到所有"*.txt"文件,如1.txt;
grep 'apple' ./1.txt文件中,查找'apple'是否存在;
find . -iname "*.txt" | grep 'apple' //这条语句是在'*.txt'文件组中,查找apple的文件名;
xargs实现批量备份(二次加工)
find ./ -name "*.log" | xargs -i cp {} {}.back //找到*.log文件后,其【结果】作为后面命令的参数;
xargs实现批量重命名
rename txt log 11.txt //分别对应的是命令,源字符串,新字符串,文件对象;
18)ls命令
ls -R //递归显示
ls -S //文件大小排序显示
19)终端快捷键
ctrl + w //删除一个单词
ctrl + e //光标到最后
ctrl + a //光标到最前
ctrl + u //光标前所有东西全部删除
ctrl + k //光标后所有内容全部删除;
ctrl + y //恢复前面的操作
20)ln命令
ln 源文件 目标文件 //硬连接和软链接都是一样的格式
inode ->index node的缩写;
ll命令后,最后一项就是硬连接数;
ln 2.log test //创建一个硬连接 2.log为源文件,test为目标文件;
ln -s test sym //给tes文件创建一个软连接
ln -s /home test //给home目录创建一个软连接
-f force 强制执行,如果存在同名链接,先删除,再创建;
-i interactive 如果存在同名链接,询问用户是否覆盖;
ls -li //查看文件的inode id
输出文件inode信息:
total 0
2884423 -rw-rw-r-- 2 jiang jiang 0 10月 27 09:11 1.txt
2884423 -rw-rw-r-- 2 jiang jiang 0 10月 27 09:11 test
从输出文件信息看,是同一个文件;
软链接是单独自己的inode,硬连接是相同的inode;
21)pwd
pwd -L //打印逻辑路径
pwd -P //打印物理路径
测试如下:
ln -sf /home/jiang/test2/build test //创建目录软链接
进入符号链接目录并打印:
jiang@jiang-X280:~/test2/build/src/test$ pwd -L
/home/jiang/test2/build/src/test
jiang@jiang-X280:~/test2/build/src/test$ pwd -P
/home/jiang/test2/build
可以看出,逻辑路径和物理路径是不一样的;
22)mv
mv 源文件 目标文件(目录或者新的名字)
相关参数
-b backup
-f fouce
-i interactive
-n no-clobber
-v verbose
23)top
显示内存占用情况的交互式工具
窗口高亮显示:按小写b,再按x,则高亮cpu的列;
共计4个窗口(输入g后,选择1~4,切换窗口)
default默认窗口,按cpu使用率排比;
job窗口,用户进程id排比
memory窗口 内存使用量排比
用户id窗口,按用户排比
分屏模式
shift + a;
在四个窗口切换方法:a 向上一个窗口,w 向下一个窗口;
24)用户权限管理
用户分为三种类型:root用户,系统用户,普通用户;
用户位置:cat /etc/passwd //每一行都代表一个用户,用冒号':'分开;
如:mysql:x:122:127:MySQL Server,,,:/nonexistent:/bin/false
分别表示:用户名:密码:用户id:组id:用户描述:家目录:登录进去后默认使用的shell;
密码位置:cat /etc/shadow
如:mysql:!:19611:0:99999:7:::
分别表示:用户名:!或者*代码没有密码:
cat /etc/default/useradd
输出:
GROUP=100
HOME=/home
INACTIVE=-1 //密码永远不过期
EXPIRE=
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
root用户: uid 0 超级管理员,拥有最大的权限;
系统用户: uid 1~499 某个软件运行时使用的用户,一般不能用于登录;
普通用户: uid 500以上 可以使用用户名和密码登录系统的用户;
25)useradd&userdel
ll /usr/sbin/ | grep user //查看用户
useradd test //创建一个test用户,其用户被保存到 cat /etc/passwd | grep test中;
sudo passwd test //增加新用户密码
sudo userdel -r test //删除用户的时候,同时删除用户的家目录和接收的文件
26)hostname
hostname 输出:jiang-X280 查看主机名
27)cut命令
cut -b 1 3.txt //截取每一行的第一字符
cut -b 1-3 3.txt //截取每一行的1-3的字符
cut -b 3- 3.txt //截取每一行的3到最后一个字节
cut -b 3,5,8 3.txt //截取每一行的指定字节,用逗号隔开
cut -d " " -f 1 3.txt //按空格输出第一个字段
cat /etc/passwd | grep saned | cut -d ":" -f 1 //cut跟管道一起合用;
cut -d " " -f 2 3.txt //以空格打印第二字段的选取内容;
complement //补充,补足,在linux是反选的意思; 反选(complement())
28)tr
translate的缩写
字符转化
echo "abc abc" | tr 'a' 'z' //输出 zbc zbc
echo "abc abc" | tr 'a-z' 'A-Z' //输出ABC ABC
echo "abcabc123" | tr '[:alpha:]' '-' //输出 ------123
echo "abcabc123" | tr '[:digit:]' '-' //输出 abcabc---
字符删除
echo "abcabc123" | tr -d '[:digit:]' //输出abcabc
29)sort
cat /etc/passwd | sort //输出的内容,按字符排序