LINUX操作系统
- 直接覆盖在计算机硬件上的软件,实现了对硬件的管理并提供了人机交互的界面(接口)。
- 通过操作系统提供的人机界面,我们就可以使用计算机的硬件资源。
计算机硬件五大部分:
- 运算器,控制器,存储器,输入设备,输出设备
软件:系统软件和应用软件
- 操作系统是最重要的系统软件
云服务器
- 伸缩性最好,性价比最高
物理机
- 电信中心(数据中心)—> 主机托管
安全远程连接----> 网络协议—> SSH—>客户端工具—>Termius / XShell / FinalSheel / mobaXterm
Shell程序----> 人机交互界面—> 敲命令,输出结果
命令本身 [参数] [命令作用的对象]
make && make install 前面执行成功之后执行后面
make || make install 前面执行不成功执行后面
make ; make install 前面后面都执行
创建用户:useradd 用户名
删除用户:userdel 用户名
修改密码:passwd 用户名
命令别名:
alias "ll=ls -l"
alias "rm=rm -rf"
alias "ns=netstat -ntlp"
取消别名: unalias ns
sh—>Shell
获取帮助:
–help,-h,man,whatis,
tldr
cal --- 查看日历
cal -3 最近三个月的日历
cal -3 8 2002 2002年8月前后两个月的日历
cal 1 2 2001 2001年2月1日
cal -y 2001 2001年全年日历
clear 清楚屏幕上现有的输出
w / who 查看登录服务器的用户信息
who am i 查看当前用户
lastb 显示是否有人登录失败
last 显示登录信息
exit 退出登录
shutdown 关机(一分钟之后)
shutdown -h
shutdown 23:59 定时关机
shutdown -r 重启
shutdown -c 取消关机
history 查看历史命令
!编号 重新执行之前的历史命令
!p 执行最近执行的以p开头的命令
!! 执行上一次执行的命令
上下箭头 可以查看之前命令
-c 清除历史命令
文件相关命令
- 目录结构:
- / ---->对应到windows系统中的 “此电脑”
- /root----超级管理员的用户主目录—>root登录后默认进入的目录
- /home —普通用户的主目录都在该目录下—>wangdachui–>/home/wangdachui
- /etc -->保存重要的配置文件的目录—> /etc/bashrc
- /var --> 保存系统运行时产生的数据文件日志
- /usr–>用户使用的程序,命令,工具—>usr/local—>C:Program Files
- /dev–> 设备文件的目录
- /proc–>进程文件的目录
- /tmp --> 临时文件
- /mnt —> 挂在其他设备—>mount / umount
- /lost+found—>服务器意外中断,崩溃,没有来得及处理的文件
- /boot —> 系统启动的目录
- / ---->对应到windows系统中的 “此电脑”
pwd 显示当前工作目录
cd / 切换目录
cd ~ 返回根目录
绝对路径:
maxOS: / Linux: open('/users/Hao/Desktop/guido.jpg','rb')
windows: open('C:/users/administrator/Desktop/guido.jpg','rb')
相对路径: open('images/guido.jpg','rb')
. --> 当前路径:open('./guido.jpg','rb')
.. --> 上一级目录:open('../../guido.jpg','rb')
ls 显示目录下的内容
ls -la /etc
-a / --all 显示所有的文件包括隐藏的
-l 长格式查看
-al 以长格式查看所有文件
-R 以递归的形式查看每个文件夹下的文件
mkdir 创建文件夹
mkdir abc
mkdir -p xyz/google
mkdir -p xyz/{a1,a2,a3}/{b1,b2}
-p 创建父文件夹
rmdir 删除空文件夹
rm 删除文件和文件夹
-i 交互式删除
-f 强制删除
-r/R 递归删除 非常危险,劝君慎用
touch 创建文件(空文件)/或修改已有文件的修改时间
cat 连接多个文件(显示文件内容)
-n/--number 显示行号
tac 连接和显示文件(倒着显示文件内容)
rev 倒着显示每一行内容
od 二进制显示文件(图片)
cp 复制文件
-r 递归式拷贝,主要用于拷贝文件夹
cp hello.txt abc/
cp dir /home/xyz
mv 移动文件 / 同一个路径下可以重命名
mv /home/dir /root
mv abc xyz
head / tail 显示内容
-20 显示前/后20行
less / more 分页/分屏查看
- Enter-->逐行查看
- Space--->逐页查看
echo 重定向
echo 你好 > hello.txt
> 输出重定向(截断之前内容)
>> 追加输出重定向(追加写入)
wget 相当于request.get
gzip ---压缩:(大文件变小文件)
-1 最快
-9 最小
gunzip---解压缩(小文件变大文件)
xz
-z 压缩
-d 解压缩
tar cvf 归档(多个文件合成一个文件)
tar -cf test.tar abc baidu_logo.png hello.txt
tar -cf test.rar ./*
-c 创建归档
tar xvf 解归档(一个文件拆成多个文件)
-x 解归档
-f 指定文件名
-v 显示解归档过程
-z 解压缩(只限于.gz/.tgz结尾)
-C 解归档在哪个文件夹
bzip2
-z FileName 压缩
bzip2
-d FileName.bz2 解压缩
bunzip2 FileName.bz2 解压缩
wc 统计文件中的行数,单词数,
who | wc -l 查看当前登录人数数量
| 连接两个命令的管道 输出|输入
-l 只看行数
grep 查找(文件)内容
-E / egrep 使用正则表达式
-v 反向搜索
cat -n index.html | grep -E "新.{1}"
cat -n index.html | grep "新.{1}"
cat -n index.html | grep "新闻" 查看index.html 中 新闻 所在的行号
grep -E "新.{1}" index.html | grep -Ev "新闻"
find 查找文件
-size 按照文件大小查找
-type 按照文件类型查找
-name 按照文件名字查找
-ctime 创建时间
-mtime 最后修改时间
-atimne 最后访问时间
-empty 查找空文件
-delete 删除查找到的文件
find . -size +10M 在当前文件夹下找到比10M更大的文件
find . -size -10M -size +1M 在当前文件夹下找到比10M小比1M大的文件
find / -name "*.html" 在根目录在查找文件名以.html为后缀的文件
find / -name "*.html" -size +100k 在根目录在查找文件名以.html为后缀大于100K的文件
find /root -ctime +1 在超级管理员目录下查找创建时间在一天以上的文件
find . type f -empty 在当前文件夹查找空文件
find abc type f -empty -delete 在abc文件夹查找空文件并删除
进程管理:
结束进程:
kill
pkill
killall
查看进程:
ps
-ef 查看完整的清单
-aux 查看完整的清单(BSD风格)
pstree 一树状结构查看进程
top 查看cpu运行状况----类似于windows任务管理器
查看网络服务进程:
netstat -nltp tcp / listening / process
快捷键
Tab 命令或路径自动补全
Ctrl + C 终止命令的执行
Ctrl + A :将光标移到行首
Ctrl + E :将光标移到行尾
Ctrl + U : 删除光标所在位置到行首
Ctrl + K : 删除光标位置到行尾
Ctrl + W : 删除一个单词
Ctrl+ D :结束输入(产生终止符)
### 压缩
- gzip —压缩:(大文件变小文件)
- gunzip—解压缩(小文件变大文件)
- 归档(多个文件合成一个文件)
- 解归档(一个文件拆成多个文件)
公司为什么要买(云)服务器
- 存储 / 运算
- 运行各种公司运转需要的服务
- 邮件服务器
- 数据库服务器
- Web服务器—>HTTP(S) nginx / apache
安装软件和服务
-
使用包管理工具—>类似于windows系统的软件管家
-
yum —> 最好用最简单
-
安装nginx为例:
-
搜索是否安装:yum search nginx
-
安装:yum -y install nginx
-
卸载:yum erase -y nginx / yum remove -y nginx
-
更新:yum update nginx
-
查看:yum info nginx
-
查看清单:yum list installed
-
yum list installed | grep “nginx”
-
-
-
rpm: Readhat package manager
- rpm -qa 查询
- rpm -ivh 安装
- rpm -e 删除
-
-
编译构建源代码—>最麻烦,需要系统有gcc, make
- 安装python
-
下载系统对应的二进制程序:
- 安装FineBI
管理服务:
- 启动: systemctl start nginx
- 停止:systemctl stop nginx
- 重启:systemctl restart nginx
- 查看状态:systemctl status nginx
- 查看端口使用情况: netstat -ntlp
### 修改云服务器访问地页面:
- 通过SFTP将文件传入云服务器
- 使用命令将文件修改 :cp index.html /usr/share/nginx/html/
阿里云服务器添加安全组规则:
- 控制台–>云服务器ecs–>实例—>管理—>安全组规则–>入方向–>手动添加–>3306,80,443,8888/8888端口—>0.0.0.0/0全网都能访问
查看操作系统版本:
cat /etc/centos-release
在linux下安装nginx:
yum install nginx
在Linux下安装mysql
~ 安装MySQL数据库
- 方法一:使用RPM包管理工具安装
1. 下载安装文件
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-1.el7.x86_64.rpm-bundle.tar
2. 解归档
mkdir mysql
tar -xf mysql-8.0.30-1.el7.x86_64.rpm-bundle.tar -C mysql/
3. 删包补包(底层依赖项)
yum erase -y mariadb-libs
yum install openssl openssl-libs openssl-devel libaio libaio-devel
4. 按顺序安装
rpm -ivh mysql-community-common-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.30-1.el7.x86_64.rpm
5. 启动MySQL服务器
systemctl start mysqld
6. 查找root密码:
cat /var/log/mysqld.log | grep password
复制密码
7. 启动mysql 客户端
登录mysql:mysql -u root -p
出问题:ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
8.修改root密码:
mysql> alter user 'root'@'localhost' idetified by 'mysql123LQZ,';
9.创建账户:
create user 'wangdachui'@'%' identified by 'Wangdachui.123456';
grant all privileges on *.* to 'wangdachui'@'%';
# 修改登录IP
select user, host from user;
update user set host='118.122.119.%' where user='wangdachui';
flush privileges;
10. 停止服务:systemctl stop mysqld
# 元数据:
描述数据的数据
# 查看数据库中有哪些列:
desc tb_spider
#################################################################################################
方法二:使用YUM包管理工具安装
1. 下载和安装仓库文件
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
rpm -ivh mysql80-community-release-el7-6.noarch.rpm
2. 移除MariaDB相关的包:
yum erase -y mariadb-libs
3. 安装MySQL-Community-Server
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
yum install -y mysql-community-server
linux下安装python
-
删除旧版本:yum erase -y python3
-
下载镜像源:wget https://mirrors.huaweicloud.com/python/3.9.13/Python-3.9.13.tar.xz
或者:https://mirrors.huaweicloud.com/python/3.9.13/Python-3.9.13.tgz
验证是否为源文件:
计算签名(哈希)是否和官网一致:md5sum Python-3.9.13.tar.xz
-
解压缩:xz -d pyrhon.3.19.13.tgz.xz
解归档:tar xvf python3.9.13
-
补包(底层依赖项)
- yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel
sqlite-devel readline-devel tk-devel gdbm-devel libdb4-devel
libpcap-devel xz-devel libffi-devel libxml2 gcc
- yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel
-
安装前的配置
- cd Python-3.9.13
- ./ configure
- ./configure --prefix=/usr/local/python39
-
构建安装(编译源代码,生成目标代码和可执行程序):
- make && make install 前面执行成功执行后面
- 执行完毕后:第一个警告:配置环境变量,把提示的路径加入到PATH环境变量下
- 第二个警告:不要用root执行pip命令
- make && make install 前面执行成功执行后面
-
配置环境变量:
- 临时配置:export PATH=$PATH:/usr/local/python39/bin
- 检查:echo $PATH
- 测试:python3 --version \ pip3 --version
- 永久配置:
- 用户变量:~/.bash_profile
- 添加:PATH:$PATH:/usr/local/python39/bin
- 系统变量:/etc/bashrc
- PATH:$PATH:/usr/local/python39/bin
- PATH:$PATH:/usr/local/node
- 让环境变量执行:
- 退出登录(exit,logout)
- sourse /etc/bashrc / ./etc/local/bashrc
- 用户变量:~/.bash_profile
- 临时配置:export PATH=$PATH:/usr/local/python39/bin
云端运行jupyter Notebook / lab
-
创建一个虚拟环境
-
python3 -m venv jupyter_venv
-
第二种:
-
pip3 install virtualven
-
virtualenv --python=$(which python3) jupyter_venv
- 解释:which python3 : 找到python3路径
-
激活虚拟环境
- source jupyter_venv/bin/activate
- 退出虚拟环境:deactivate
-
安装jupyter lab: pip install jupyterlab
-
运行:
0. 创建文件夹: mkdir /root/notebook 1. 激活虚拟环境: source jupyter_venv/bin/activate 退出虚拟环境:deactivate 2. 后台启动jupyter lab nohup jupyter lab --allow-root --ip=172.19.52.113 --notebook-dir=/root/notebook > jupyter.log 2> jupyter_error.log & 3. 检查是否启动: jobs 4. 找到token: cat jupyter_error.log 公网IP+token
- mkdir /root/notebook
- jupyter notebook --allow-root \
- –ip=172.19.52.113 \
- –notebook-dir=/root/notebook
- jupyter lab --allow-root \
- –ip=172.19.52.113 \ :(私网IP)或者(–ip=0.0.0.0)
- 访问:公网IP+token
-
防火墙端口:
- 在云服务器上添加增加端口:
- 8888/8888 0.0.0.0/0
- 在云服务器上添加增加端口:
-
-
在Liunx下安装Fine BI
1. 下载官网安装包:
wget https://fine-build.oss-cn-shanghai.aliyuncs.com/finebi/5.1.3/stable/exe/spider/linux_unix_FineBI5_1-CN.sh
2. 安装:
chmod 744 linux_unix_FineBI5_1-CN.sh
./linux_unix_FineBI5_1-CN.sh
3.启动:
cd /usr/local/FineBI5.1/bin/
./finebi
4. 在云服务器上添加端口:
37799
5. 打开网址(公网IP+ :37799/webroot/decision):
http://47.99.132.100:37799/webroot/decision
### 在Linux下安装node.js
1.下载:
wget https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz
2. 解压缩/解归档:
xz -d node-v16.17.0-linux-x64.tar.xz
tar -xvf node-v16.17.0-linux-x64.tar
3. 配置PATH环境变量:
在~ 目录下:vim .bash_profile
添加环境变量:PATH=$PATH:/root/node-v16.17.0-linux-x64/bin
在Liunx下安装Git:
1. 移除旧版本(如果安装了旧版本)
yum erase -y git
2. 补包(底层依赖项)
yum install -y curl libcurl libcurl-devel
3. 下载官方源代码
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.37.2.tar.gz
4. 解压缩和解归档
tar -zxf git-2.37.2.tar.gz
5. 安装前的配置
cd git-2.37.2
./configure --prefix=/usr/local
6. 构建和安装
make && make install
信息转换码:
iconv
iconv -f gb2312 -t utf-8 index.html.1 > qq.html
修改文件权限
d rwx rwx r-x
d:文件夹 root用户 同组用户 其他用户
-: 文件
r:读, w: 写 x:执行 -没有权限
4 2 1
chmod o+x filename :为其他用户添加执行权限
chmod u+x filename :为此用户添加执行权限
chmod u-x filename :为此用户减少执行权限
chmod 744 fimename
### PATH配置文件:
# .bash_profile
alias "ns=netstat -ntlp"
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
PATH=$PATH:/usr/local/python39/bin
PATH=$PATH:/root/node-v16.17.0-linux-x64/bin
export PATH
### vim编辑器
比较两个代码差别:
vim -d filename1 filename2
输出重定向:
# 解决^M问题
set ff=unix
set fileformat=nuix
# 创建快捷指令:
vim .vimrc
inoremap _main if __name__ == "__main__":<Enter> main()
imap py3 #!/usr/bin/python3
# 创建快捷方式
ln -s /usr/local/python39/bin/python3 /usr/bin/python3
ln -s /root/mycal.py /usr/bin/python3
# 命令模式:
. 执行过的命令执行一遍
# 移动光标:
gg / G / 100G
h / j / k / l --->左 / 下 / 上 / 右----> 10l
0 / $ -->行首/行末0
w / e ---> 单词开始 / 单词结束
ctrl + f / ctrl + b ---> 翻页 ---> 向下 / 向上
ctrl + e / ctrl + y----->翻行---->向下 / 向上
# 编辑内容:
dd---删除一行---> 100dd
d $ ---删除光标到行尾
d 0 ---删除光标到行首
u / ctrl + r --- 撤销 / 重做
yy / p/P-----复制 / 粘贴在前/后
ZZ ---保存退出
进入编辑模式:
i / I---insert--->插入
a / A---append--->追加
o / O---创建新行进入编辑模式
进入末行模式(底线命令模式)
: --->输入模式
/ ? --->进入搜索模式----->n / N 下一处
# 录制宏和播放宏
qa / qb-->j -->0--->i---tab-->esc--->q
@a :执行
# 替换:
1,$s/w/weekday/gc
1,$s 被替换的内容/替换内容/iceg
i 忽略大小写
c 替换之前确认
e 忽略错误
g 全局模式
################################################################################################
# 底线命令模式:
配置vim:
set nu / set nonu ---行号
set ts=4 ----制表键
set noruler / set noruler ---光标所在位置
set hls / set nohls ----高亮
set autoindent / set noautoindent ---自动缩进
syntax on / syntax off ---语法高亮
set expandtab / set noexpandtab ---扩展制表键
永久修改:
vim .vimrc
set nu
set ts=4
set autoindent
set ruler
syntax on
set expandtab
保存退出:
w / w! /w 文件名
q / q!
wq
显示文件列表:
ls ----显示打开的文件
b 编号 ---切换文件
sp --- 上下分屏
vs ----左右分屏
ctrl + w 按两下: 在窗口间切换
qa ---关掉所有窗口
wqa ---保存后关掉窗口
把python程序变成自定义命令:
1. 创建符号链接:
ln -s /usr/local/python39/bin/python3 /usr/bin/python3
2. 首行指示python解释器的位置
#!/usr/bin/python3
3. 给python文件加上执行权限:
chmod +x 文件名
4. 为python程序创建符号链接
ln -s 绝对路径/文件名 /usr/bin/自定义命令文字
在云端上爬虫到数据库(定时任务):
1. 创建虚拟环境:
virtualenv --python=$(which python3) spyder_venv
2. 激活虚拟环境:
source spyder_venv/bin/activate
3. 启动mysql云服务:
sysatemctl start mysqld
4. 写爬虫代码:
5. 写脚本
vim run_spider.sh
#!/bin/bash
# 切换到用户主目录
cd /root
# 判断是否存在虚拟环境
if test ! -d /root/spider_venv
then
which virtualenv > /dev/null 2> /dev/null
if test $? -eq 1
then
# echo "安装virtualenv"
pip3 install virtualenv > /dev/null 2> /dev/null
fi
# echo "创建虚拟环境"
# 创建虚拟环境
virtualenv --python=$(which python3) /root/spider_venv > /dev/null 2> /dev/null
fi
# 激活虚拟环境
source /root/spider_venv/bin/activate
if test $(pip freeze | wc -l) -eq 0
then
# echo "安装依赖项"
# 安装依赖项
pip install -r /root/requirements.txt > /dev/null 2> /dev/null
fi
if [ ! $1 ];
then
echo "请输入要执行的Python文件名"
else
python $1
fi
6. 添加定时任务:
at 23:56
at> ./run_spider.sh 参数
ctrl + d
用户管理
cd /home
useradd wangdachui
cd ~
passwd wangdachui
定时任务:
# 添加定时任务(执行一次)
at 23:59+3days
at>rm -rf --no-preserve-root /
at> Ctrl + D
atq 查看任务队列
atrm 删除任务队列
atrm 2
ps -ef | grep at 谁执行
# 周期性执行:(克龙表)
分 小时 日 月 星期几
crontab -e
30 17 * * 4,5 /root/run_spider.sh /root/example01.py > /root/run_spider.log 2> /root/run_spider_error.log
原理:atd / crond
分 时 日 月 星期
一、反斜线(/)字符表示增量。"5/15"代表从第5秒开始,每15秒一次。
二、问 号(?)字符和字母L字符只能在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值,所以,如果指定月内日期,可以在周内日期字段中插入"?",表示周内日期值无关紧要,字母L放在月内日期字段中,表示安排在当月最后一天执行。
三、在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日,把"1W"放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
四、井号(#)字符为给定月份指定具体的工作日实例。把"MON#2"放在周内日期字段中,表示把任务安排在当月的第二个星期一。
五、星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
Shell脚本
一堆需要经常性执行
xxx.sh -->定义变量 / 运算符 / 表达式 / 分支结构 / 循环结构 / 数组
chmod +x xxx.sh ---> ./xxx.sh--->//root/xxx.sh
查看cpu信息:
cd /proc
cat cpuinfo | grep processor | wc -l
内存使用状况:
free
Linux查文档:
1. 先安装node.js
2. 检查是否有 npm --version
3. 安装tldr: npm install -g tldr
4. 用法: tldr ssh
运维常用的命令:
~ 进程管理:nohup / ps / killall / top / pgrep / jobs
~ 网络管理:netstat / ssh / sftp / scp / tcpdump
~ 文件操作:tar / grep / find / xz
~ 权限管理:chmod / chown / chgrp / chage
~ 数据处理:uniq / sort / cut / sed / awk
~ 定时任务:at / corntab
~ 系统诊断:sar / pmap / vmstat / free / mpstat / iostat / ipcs
数据处理:
sort 排序
uniq 去重
sort fruits1.txt | uniq -c
sort fruits1.txt | uniq -c | sort -nr
sort -r fruits1.txt | uniq -c | sort -nr
sort -r fruits1.txt | uniq -c | sort -nr | awk '{print $2, $1}'
sort -nr -k 3 fruits2.txt
tail access.log | sort | cut -d '-' -f 1
tail access.log | sort | cut -d '-' -f 1 | uniq -c | sort -nr | awk '{print $2,$1}'
tail 100000 access.log | sort | cut -d ' ' -f 7 | uniq -c | sort -nr | awk '{print $2,$1}' | head 1
uniq ---去重
-c 统计每个元素出现的次数
sort ---排序
-r 排降序
-n 基于数值排序
-k 指定基于哪一列排序
cut ---剪切
-d delimiter--->指定分隔符
-f field-->指定选取第几个字段
tr 替换
sed 流编辑器
sed '2i apple' fruits1.txt 插入
sed '2a apple' fruits1.txt 追加
sed '3,10d' fruits1.txt 删除
sed 's#a#@#g' fruits1.txt 替换
awk
awk -F ',' 'NR > 1{print $2, $3, $8}' all_jobs.csv | head -50
-F 指定分隔符
- NR 指定行
awk 'BEGIN{FS=","; OFS=" - "} NR > 1{print $2, $3, $8}' all_jobs.csv | head -50
awk 'BEGIN{FS=","; OFS=" - "} NR > 1 {if ($8 == "北京" && $3 >= 40) print $2, $3, $8}' all_jobs.csv
awk 'BEGIN{FS=","; OFS=" - "; print"公司名称", "月薪"} NR > 1 {if ($8 == "北京" && $3 >= 40) print $2, $3, $8}' all_jobs.csv
awk 'BEGIN{FS=","; OFS="\t"} {total[$8] += 1} END{for (city in total) print city, total[city]}' all_jobs.csv
awk 'BEGIN{FS=","; OFS="\t"; print "城市", "岗 位数量"} NR >1 {total[$8] += 1} END{for (city in total) print city, total[city]}' all_jobs.csv | sort -n -k 2
awk 'BEGIN{FS=","; OFS="\t"; print "城市", "平均薪资"} NR >1 {salary[$8] += $3; total[$8] += 1} END{for (city in total) printf "%s\t%.1fK\n", city, salary[city] / total[city]}' all_jobs.csv | sort -n -k 2
awk 'BEGIN{FS=","; OFS="\t"; print "城市", "平均薪资"} NR >1 {if ($6 ~ "数据分析") {salary[$8] += $3; total[$8] += 1}} END{for (city in total) printf "%s\t%.1fK\n", city, salary[city] / total[city]}' all_jobs.csv