shell可以与linux内核进行操作,常见的shell有Bourne Shell、Bourne Again Shell(bin/bash)(最常用)、K shell、Shell for Root等。
linux和mac电脑可通过打开终端进行linux命令练习
windows可通过Git bash进行练习
常用命令:
mkdir:创建文件夹
ls:查看文件目录
rm:删除文件,如:rm -rf test.txt
rmdir:删除文件夹,如:rmdir zdhtest
clear:清空屏幕
vim:创建一个文件,如:vim test.sh
:wq:保存文件
./test.sh:执行文件(用bash执行) /bin/sh test.sh:执行文件(用sh执行)
chmod +x test.sh:增加文件执行权限
chmod 777 test 修改test目录的属性,所有组可读可写可执行
cat:查看文件
文件操作命令:
ls(列出目录)
ls -l(查看文件属性)
ls -ld(查看指定文件的属性) 如:ls -ld file.txt
cd(切换目录)
pwd(显示目前的目录)
mkdir(创建一个新的目录)
rmdir(删除一个空的目录)
cp(复制文件或目录)
rm(移除文件或目录)
mv(移动文件与目录,或修改文件与目录的名称) 如:mv file.txt ~/zdhtest
目录:d开头,
文件:-开头
连接文件:l开头:
设备文件:b开头
设备文件中的串行端口设备,如鼠标 键盘:c开头
网络操作命令
ping -c 次数 -l 时间间隔
netstat:打印linux网络系统的状态信息
-t 列出所有的tcp
-u 列出所有的udp
-l 只显示监听端口
-n 以数字形式显示地址和端口号
-p 显示进程的pid和名字
性能查看命令
top:持续监视系统性能
ps:查看进程信息,-aux 显示所有进程,包括用户,分组情况
管道与linux三剑客
Linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
如:echo "hello1234" | grep "hello"
正则演练环境:https://tool.oschina.net/regex
grep
选项:
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep
列如:
查找文件内容包含root的行数:grep -n root test.txt
查找文件内容不包含root的行:grep -nv root test.txt
查找文件内容以‘s’开头的(grep与正则组合使用):grep ^s test.txt
sed:
sed是流处理器,一次处理一行内容
选项:
-h 显示帮助
-n 仅显示script处理后的结果
-e<script>以选项中指定的script来处理输入的文本文件
-f<script文件>以选项中指定的script文件来处理输入的文本文件
脚本中常见的动作
a:新增 如:sed -e '4 a newline' 在脚本的第四行后面新增一行‘newline’
c:取代 如:sed -e '2,5c No 2-5 number'用c后面的内容取代2-5行的内容
d:删除 如:sed -e '2,5d' 删除2-5行
i:插入 sed -e '2i newline' 在2行前面插入新行‘newline’
p:打印 sed -n '/root/p'打印匹配到‘root’的内容
s:取代 sed -e 's/old/new/g'用new替换old /g表示全局
查看帮助文档:man sed
比如:sed 's/hello/root/g' test.txt 表示将文件中所有的hello替换成root
注意:上面的操作不是对源文件进行的操作,是对模式空间中的文件做的操作,要保存对文件的操作需要这样写,加一个-i:sed -i 's/hello/root/g' test.txt
awk
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
选项:
-pattern 正则表达式
-action 对匹配到的内容执行的命令(默认为输出每行内容)
常用参数:
FILENAME awk浏览的文件名
BEGIN 处理文本之前要执行的操作
END 处理文本之后要执行的操作
FS 设置输入域分隔符,等价域命令行-F选项
NF 浏览记录的域的个数(列数)
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 整体记录
$1 表示当前行的第一个域......以此类推
列如:
1.awk -F : '/root/{print $0}' /rtc/passwd
表示读取etc/passwd脚本所有记录中以‘:’分隔后,包含root的行
实际结果输出:root:x:0:0:root:/root:/bin/bash
2.awk -F : 'root/{print $7}' /etc/passwd
表示读取etc/passwd脚本‘/bin/bash’
实际结果输出:/bin/bash
3.awk -F : 'NR==2{print $0}' /etc/passwd
表示读取etc/passwd脚本第二行的内容
4.awk -F : 'BEGIN{print "BEGIN,BEGIN"}'
表示文本之前输出"BEGIN,BEGIN"
5.awk -F : 'BEGIN{print "BEGIN,BEGIN"}{print $1,$2}' /etc/passwd
表示先输出"BEGIN,BEGIN",然后输出脚本/etc/passwd的第一列和第二列之前
6.echo "123|456|789|" | awk 'BEGIN{RS="|"}{print $0}'
表示换行输出以'|'分隔后的内容('|'是管道分隔符,左侧输出是右侧的输入)
总结:grep命令主要用于查找过滤,awk主要用于行列之间的操作,分隔等,sed主要用于替换。
ping test.com | grep --line-buffered '11' | awk '{print $0}'
管道前面的输出是一个动态的时,管道后面再接收其他命令,结果返回会需要很久,使用--line-buffered可以让它实时输出
ping test.com | grep --line-buffered '11' | awk '{print $NF}' 拿到最后面的一个字段
ping test.com | grep --line-buffered '11' | awk '{print $(NF-1)}' 拿到最后面的前面一个值
echo 'ping test.com' | awk 'BEGIN{var=1}/test/{print $0}END{print var}'
表示在匹配包含‘test’的内容前,定义了一个变量var=1,匹配完后,输出var的值
实际输出:
test.com
1
echo '1234abcd5678efgh' | sed -E 's#([0-9]*)([a-z]*).*#mv \1 \2#'
表示使用正则将'1234abcd5678efgh' 中的值取出来,\1 \2表示取匹配到的值
结果输出为:mv abcd 1234
echo '1234abcd5678efgh' | sed -E 's#([0-9]*)([a-z]*).*#mv \1 \2#' 后面加个bash,执行将文件abcd重命名为1234
重命名文件:
ls | sed -E 's#(.*)#mv \1 1234#'
表示将ls下的文件,重命名为1234