1. 关于用python计算竖乘的问题,具体要求和希望输出格式如下
草稿版
#coding:utf-8
'''
***
x***
------------
****
****
****
------------
******
eachstartisanumber;
sumforeachlineshallbesame
'''
importrandomasRND
defNumberListFactory(width=3):
standard=range(10)
ret=[]
foriinxrange(0,width):
ifi==0:
value=standard.pop(RND.randint(1,len(standard)-1))
else:
value=standard.pop(RND.randint(0,len(standard)-1))
ret.append(value)
returnret
defNumber2List(num):
ret=[]
tmp=0
foriinxrange(len(str(num))-1,0,-1):
key=(num-tmp)/(10**i)
ret.append(key)
tmp=tmp+key*(10**i)
ret.append(num-tmp)
returnret
defList2Number(lst):
ret=0
foriinxrange(0,len(lst)):
ret+=lst[i]*(10**(len(lst)-i-1))
returnret
defList2String(lst):
return''.join([str(i)foriinlst])
defIsUniq(lst):
foriinlst:
tmp=lst[:]
tmp.remove(i)
ifiintmp:
returnFalse
returnTrue
counter=0
result=None
whileresultisNone:
counter+=1
p1=NumberListFactory()
p2=NumberListFactory()
standard=sum(p1)
ifstandard!=sum(p2):
continue
else:
multiResult=[]
foriinxrange(len(p2)-1,-1,-1):
tmp=Number2List(p2[i]*List2Number(p1))
iflen(tmp)!=4:#
continue
else:
ifIsUniq(tmp):
multiResult.append(tmp)
#filterresultwhenzero
iflen(multiResult)!=3:
continue
#
flag=True
forjinmultiResult:
ifstandard!=sum(j):
flag=False
break
ifflagisFalse:
continue
#
result=Number2List(List2Number(p1)*List2Number(p2))
iflen(result)!=6orstandard!=sum(result)orIsUniq(result)isFalse:
result=None
continue
else:
print'SUMofLine->{}'.format(standard)
print'LoopID:{} '.format(counter)
print'{}'.format(List2String(p1))
print'x{}'.format(List2String(p2))
print'-'*12
forkinxrange(len(multiResult)-1,-1,-1):
print'{}{}'.format(''*k*2,List2String(multiResult[len(multiResult)-1-k]))
print'-'*12
printList2String(result)
print' Over'
可以的话,做一些优化。
2. (求算法高手!)将一个正整数表示为N个不同的正整数之和。
200分悬赏啊,我要试一试啊。
首先是思路:
n能被拆分成不同的整数之和 =
S(1) = (n-1) + 1能被拆分成不同的整数之和
S(2) = (n-2) + 2能被拆分成不同的整数之和
。。。
S(n-1) = (n-1)能被拆分成不同的整数之和
最后一步:求并集
S(n) = Union( S(1), S(2), S(3), ..., S(n-1) )
=========================================
手动模拟一下这个算法:
n=6 能被拆分成不同的整数之和
5 + 1能被拆分成不同的整数之和 => S1 = [5,1]
4 + 2能被拆分成不同的整数之和 => S2 = [4,2]
3 + 3能被拆分成不同的整数之和
这一步要递归
3能被拆分成不同的整数之和
= 2 + 1能被拆分成不同的整数之和 => [2,1]
= 1 + 2能被拆分成不同的整数之和 => 重复
=>S3 = [3,2,1]
2 + 4能被拆分成不同的整数之和,重复,S4=[]
1 + 5能被拆分成不同的整数之和,重复,S5=[]
S = Union( S1, S2, S3, S(4), S(5) )
= [[5,1], [4,2], [3,2,1]]
=========================================
最后就是代码啦,python实现的
有2个函数,NumberSplit计算所有的拆分,checkuniq用来去重复的,去重复用了点python技巧,C++的话用hash_set应该也可以。
def NumberSplit( n ):
if n<0:
raise Exception
if n<3:
return [[n]]
sumArray = list()
for i in range(1,n):
t = NumberSplit(n-i)
for item in t:
if i in item:
continue
item.append(i)
sumArray.append(item)
return sumArray
def checkuniq(x):
for item in x:
item.sort()
return list(set(map(tuple, x)))
========================
试一下结果:
>>> checkuniq(NumberSplit(9))
[(1, 3, 5), (2, 7), (2, 3, 4), (1, 2, 6), (1, 8)]
整个大点的数字,呵呵有点慢,没有优化。
>>> g=checkuniq(NumberSplit(20))
>>> g.sort()
[(1, 2, 3, 4, 10), (1, 2, 3, 5, 9), (1, 2, 3, 6, 8), (1, 2, 3, 14), (1, 2, 4, 5, 8), (1, 2, 4, 6, 7), (1, 2, 4, 13), (1, 2, 5, 12), (1, 2, 6, 11), (1, 2, 7, 10), (1, 2, 8, 9), (1, 2, 17), (1, 3, 4, 5, 7), (1, 3, 4, 12), (1, 3, 5, 11), (1, 3, 6, 10), (1, 3, 7, 9), (1, 3, 16), (1, 4, 5, 10), (1, 4, 6, 9), (1, 4, 7, 8), (1, 4, 15), (1, 5, 6, 8), (1, 5, 14), (1, 6, 13), (1, 7, 12), (1, 8, 11), (1, 9, 10), (1, 19), (2, 3, 4, 5, 6), (2, 3, 4, 11), (2, 3, 5, 10), (2, 3, 6, 9), (2, 3, 7, 8), (2, 3, 15), (2, 4, 5, 9), (2, 4, 6, 8), (2, 4, 14), (2, 5, 6, 7), (2, 5, 13), (2, 6, 12), (2, 7, 11), (2, 8, 10), (2, 18)]
3. 运维需要掌握的技术
运维需要掌握的技术有:linux系统基础、网络服务、shell脚本和另一个脚本语言、sed和awk工具、文本处理命令、数据库、数据库、监控工具、集群和热备、数据备份。
1、Linux系统基础
是基础中的基础,参考书籍,至少要掌握这书60%内容,没必须全部掌握。
6、数据库
首选mysql,因为Linux用得最多绝对是mysql,增删改查必学,特别要学熟查,其它方面可能不太需要,因为运维人员使用最多还是查,哪些优化和开发语句不会让你弄的。
7、防火墙
防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
8、监控工具
有cacti、nagios、zabbix、Prometheus,企业用得最多应该是nagios和zabbix。
4. TypeScript 类型挑战 Medium
[[toc]]
Medium , #infer , #built-in
实现 TS 内置的 ReturnType<T> ,但不可以使用它。
答案
Medium , #union , #built-in
不使用 Omit 实现 TypeScript 的 Omit<T, K> 泛型。
Omit 会创建一个省略 K 中字段的 T 对象。
答案
Medium , #readonly , #object-keys
实现一个通用 MyReadonly2<T, K> ,它带有两种类型的参数 T 和 K 。
K 指定应设置为Readonly的 T 的属性集。如果未提供 K ,则应使所有属性都变为只读,就像普通的 Readonly<T> 一样。
答案
Medium , #readonly , #object-keys , #deep
实现一个通用的 DeepReadonly<T> ,它将对象的每个参数及其子对象递归地设为只读。
您可以假设在此挑战中我们仅处理对象。数组,函数,类等都无需考虑。但是,您仍然可以通过覆盖尽可能多的不同案例来挑战自己。
答案
Medium , #infer , #tuple , #union
实现泛型 TupleToUnion<T> ,它返回元组所有值的合集。
答案
Medium , #application
在 JavaScript 中我们很常会使用可串联(Chainable/Pipeline)的函数构造一个对象,但在 TypeScript 中,你能合理的给他附上类型吗?
在这个挑战中,你可以使用任意你喜欢的方式实现这个类型 - Interface, Type 或 Class 都行。你需要提供两个函数 option(key, value) 和 get() 。在 option 中你需要使用提供的 key 和 value 扩展当前的对象类型,通过 get 获取最终结果。
你只需要在类型层面实现这个功能 - 不需要实现任何 TS/JS 的实际逻辑。
你可以假设 key 只接受字符串而 value 接受任何类型,你只需要暴露它传递的类型而不需要进行任何处理。同样的 key 只会被使用一次。
答案
Medium , #array
实现一个通用 Last<T> ,它接受一个数组 T 并返回其最后一个元素的类型。
答案
Medium , #array
实现一个通用 Pop<T> ,它接受一个数组 T 并返回一个没有最后一个元素的数组。
额外 :同样,您也可以实现 Shift , Push 和 Unshift 吗?
答案
Medium , #array , #built-in
键入函数 PromiseAll ,它接受PromiseLike对象数组,返回值应为 Promise<T> ,其中 T 是解析的结果数组。
答案
Medium , #union , `#map
有时,您可能希望根据某个属性在联合类型中查找类型。
在此挑战中,我们想通过在联合类型 Cat | Dog 中搜索公共 type 字段来获取相应的类型。换句话说,在以下示例中,我们期望 LookUp<Dog | Cat, 'dog'> 获得 Dog , LookUp<Dog | Cat, 'cat'> 获得 Cat 。
答案
Medium , #template-literal
实现 TrimLeft<T> ,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。
答案
Medium , #template-literal
实现 Trim<T> ,它是一个字符串类型,并返回一个新字符串,其中两端的空白符都已被删除。
答案
Medium , #template-literal
实现 Capitalize<T> 它将字符串的第一个字母转换为大写,其余字母保持原样。
答案
Medium , #template-iteral
实现 Replace<S, From, To> 将字符串 S 中的第一个子字符串 From 替换为 To 。
答案
Medium , #template-literal
实现 ReplaceAll<S, From, To> 将一个字符串 S 中的所有子字符串 From 替换为 To 。
答案
Medium , #arguments
实现一个泛型 AppendArgument<Fn, A> ,对于给定的函数类型 Fn ,以及一个任意类型 A ,返回一个新的函数 G 。 G 拥有 Fn 的所有参数并在末尾追加类型为 A 的参数。
答案
Medium , #union
实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。
答案
https://github.com/type-challenges/type-challenges/issues/614
Note
Medium , #template-literal
计算字符串的长度,类似于 String#length 。
答案
Medium , #array
在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。
答案
Medium , #object-keys
实现一个为接口添加一个新字段的类型。该类型接收三个参数,返回带有新字段的接口类型。
答案
Medium , #math , #template-literal
实现一个接收string,number或bigInt类型参数的 Absolute 类型,返回一个正数字符串。
答案
Medium , #union , #string
实现一个将接收到的String参数转换为一个字母Union的类型。
答案
Medium , #object
实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。
答案
Medium , #
FooBarBaz -> foo-bar-baz
答案
Medium , #object
获取两个接口类型中的差值属性。
答案
Medium , #array
在类型系统中实现类似于 Python 中 any 函数。类型接收一个数组,如果数组中任一个元素为真,则返回 true ,否则返回 false 。如果数组为空,返回 false 。
答案
Medium , #union , #utils
实现 IsNever 类型, 解析输入 T 类型为 never 返回 true 否则 返回 false
答案
Medium , #union , #utils
实现 IsUnion 类型, 解析输入 T 类型为联合类型 返回 true 否则 返回 false
答案
Medium
实现 ReplaceKeys 类型, 它将替换联合类型中类型的键值, 如果该类型没有这个Key则跳过,如果有则替换。
答案
Medium
从对象类型中排除索引签名。
答案
https://github.com/type-challenges/type-challenges/issues/3542
Medium
实现类型 PercentageParser。根据规则 /^(+|-)?(d*)?(\%)?$/ 匹配类型 T。
匹配的结果由三部分组成,分别是:[ 正负号 , 数字 , 单位 ],如果没有匹配,则默认是空字符串。
答案
Medium
从字符串中剔除指定字符。
答案
Medium , Math
给定一个正整数作为类型的参数,要求返回的类型是该数字减 1。
答案
Medium , object
从 F 中选出类型相同的属性
答案
Medium , #object
保留没有在U中指定的类型的字段
答案
Medium , #template-literal
实现 StartsWith<T, U> ,接收两个string类型参数,然后判断 T 是否以 U 开头,根据结果返回 true 或 false
答案
Medium , #object
实现一个通用的 PartialByKeys<T, K> ,它接收两个类型参数 T 和 K 。
K 指定应设置为可选的 T 的属性集。当没有提供 K 时,它就和普通的 Partial<T> 一样使所有属性都是可选的。
答案
Medium , #object
实现一个通用的 RequiredByKeys<T, K> ,它接收两个类型参数 T 和 K 。
K 指定应设为必选的 T 的属性集。当没有提供 K 时,它就和普通的 Required<T> 一样使所有的属性成为必选的。
答案
Medium , #readonly , object-keys
实现一个通用的类型 Mutable<T> ,使类型 T 的全部属性可变(非只读)。
答案
Medium , #object
1
答案
Medium
给定只包含字符串的元组,和类型U, 递归构建对象
答案
Medium , #tuple
实现类型版本的数组反转 Array.reverse
答案
Medium , #arguments
实现类型版本的 lodash _.flip 函数
类型 FlipArguments<T> 需要函数 T 并返回一个新的函数类型。这个函数类型拥有相同的参数,但参数类型是被反转的。
答案
Medium , #array
按深度递归展平阵列。
答案
Medium
块、元素、修饰符方法 (BEM) 是 CSS 中类的流行命名约定。例如,块组件将表示为 btn ,依赖于块的元素将表示为 btn__price ,改变块样式的修饰符将表示为 btn--big 或 btn__price--warning 。实现 BEM<B, E, M> 从这三个参数生成字符串联合。其中 B 是字符串文字,E 和 M 是字符串数组(可以为空)。
答案
Medium , #object
实现二叉树中序遍历的类型版本。
答案
Medium
实现类型 just-flip-object :
答案
Medium
实现泛型 Fibonacci<T> 传入数字 T 返回正确的 Fibonacci number .
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
答案
Medium
实现类型 AllCombinations<S> 返回所有字符组合.
答案
Medium , #array
实现类型 GreaterThan<T, U> 来比较大小,就像 T > U 。不需要考虑负数
1
答案
Medium , #tuple
实现 Zip<T, U> 类型。 T, U 必须为 Tuple
答案
Medium , #tuple
实现 IsTuple , 接收类型 T 判断 T 是否为元组类型
答案
Medium , #tuple
实现 Chunk<T, N> , 它有两个必填的类型参数, T 必须为 tuple , N 必须为大于1的数字
答案
Medium , tuple
Fill , 一个常用的 JavaScript 函数, 我们用类型实现它. Fill<T, N, Start?, End?> , 它接收4个类型参数, T , N 是必填参数 T 为元组, N 为 any, Start , End 是可选参数,为大于零的数子.
为了模拟真实的功能,测试中可能会包含一些边界条件,希望大家喜欢:)
答案
Medium
实现 TrimRight<T> 它采用精确的字符串类型并返回一个删除了空格结尾的新字符串。
答案
Medium , #union , #array
实现一个像 Lodash.without 函数一样的泛型 Without<T, U>,它接收数组类型的 T 和数字或数组类型的 U 为参数,会返回一个去除 U 中元素的数组 T。
答案
Medium , template-literal
实现类型版本的 Math.trunc . 它接受字符串或数字返回整数部分,提出小数部分
答案
Medium , #array
实现类型版本的 Array.indexOf<T, U> , 它接收数组T 和 U 返回U在T中的索引值
答案
Medium , #array
实现类型版 Array.join<T, U> 接收数组T和字符串或数字 U
答案
Medium , #array
实现类型版本的 Array.lastIndexOf<T, U> , 它接收数组T 和 U 返回U在T中的反向索引值
答案
Medium , #array
实现类型版本的 Lodash.uniq , 它接收数组T,返回去重后的T
答案
Medium
实现 MapTypes<T, R> 它将对象 T 中的类型转换为类型 R 定义的不同类型,类型 R 具有以下结构。
答案
Medium , #tuple
构造一个给定长度的元组
答案
Medium
有时我们想限制数字的范围......例如。
答案
Medium , #array , #application , #string
给定一个字符串数组,进行置换和组合。它对于像video controlsList这样的类型也很有用
答案
Medium , #union
给定一个唯一元素数组,返回所有可能的子序列。
子序列是一个序列,可以通过删除一些元素或不删除任何元素而从数组中派生,而不改变其余元素的顺序。
答案
5. MacOS 常用终端命令大全
MAC系统采用Unix文件系统,所有文件都挂在根目录下面,没有Windows系统的盘符概念,根目录用斜杠(/)表示;
根目录(/)不是可有可无,/System表示根目录下的System文件,System表示当前目录下的System文件;
在 Unix系统中区别字符大小写,A.txt 不等于 a.txt;
关键的标点符号:点(.)表示当前目录;两个点(..)表示上一级目录;星号(*)匹配任意字符任意次数;问号(?)匹配任意字符仅一次;
获得权限:为了防止误操作破坏系统,再用户状态下没有权限操作重要的系统文件,先要获取root权限,语法:sudo -s,然后会提示输入密码,输入密码时没有任何回显,连星号都没有,输入完密码按回车键即可;
编辑文件:vim directory/file_name,若指定路径的文件不存在,则新建空文件,输入字母i或o进入编辑模式,编辑好内容,点击【esc】键后,输入:w进行保存;输入:wq进行保存并退出;输入:q!进行不保存强行退出;
table键,单击可以实现自动补全,双击可以列出指定路径下的所有内容,类似ls命令;
常用位置
驱动所在位置: /Systme/Library/Extensions
用户文件夹位置:/User/用户名,可以用波浪号(~)表示
桌面位置:/User/用户名/Desktop,可以用~/Desktop表示
清理系统
按天进行清理:sudo periodic daily
按每周进行清理:sudo periodic weekly
按每月进行清理:sudo periodic monthly
按上面3种情况进行清理:sudo periodic daily weekly monthly
命令——功能描述——示例
mkdir——创建一个目录——mkdir dirname
rmdir——删除一个目录——rmdir dirname
mvdir——移动或重命名一个目录——mvdir dir1 dir2
cd——改变当前目录——cd dirname
pwd——显示当前目录的路径名——pwd
ls——显示当前目录的内容——ls -la
dircmp——比较两个目录的内容——dircmp dir1 dir2
命令——功能描述——示例
cat——显示或连接文件————cat filename
pg分页格式化显示文件内容——pg filename
more——分屏显示文件内容——more filename
od——显示非文本文件的内容——od -c filename
cp——复制文件或目录——cp file1 file2
rm——删除文件或目录——rm filename
mv——改变文件名或所在目录——mv file1 file2
ln——联接文件——ln -s file1 file2
find——使用匹配表达式查找文件——find . -name “*.c” -print
file——显示文件类型——file filename
open——使用默认的程序打开文件——open filename(open . 打开当前目录)
命令——功能描述——示例
head——显示文件的最初几行——head -20 filename
tail——显示文件的最后几行——tail -15 filename
cut——显示文件每行中的某些域——cut -f1,7 -d: /etc/passwd
colrm——从标准输入中删除若干列——colrm 8 20 file2
paste——横向连接文件——paste file1 file2
diff——比较并显示两个文件的差异——diff file1 file2
sed————非交互方式流编辑器——sed “s/red/green/g” filename
grep——在文件中按模式查找——grep “^[a-zA-Z]” filename
awk——在文件中查找并处理模式——awk ‘{print 111}’ filename
sort——排序或归并文件——sort -d -f -u file1
uniq——去掉文件中的重复行——uniq file1 file2
comm——显示两有序文件的公共和非公共行——comm file1 file2
wc——统计文件的字符数、词数和行数——wc filename
nl——给文件加上行号——nl file1 >file2
命令——功能描述——示例
passwd——修改用户密码——passwd
chmod——改变文件或目录的权限——chmod ug+x filename
umask————定义创建文件的权限掩码——umask 027
chown——改变文件或目录的属主——chown newowner filename
chgrp——改变文件或目录的所属组——chgrp staff filename
xlock——给终端上锁——xlock -remote
命令——功能描述——示例
make——维护可执行程序的最新版本——make
touch——更新文件的访问和修改时间——touch -m 05202400 filename
dbx——命令行界面调试工具——dbx a.out
xde——图形用户界面调试工具——xde a.out
命令——功能描述——示例
ps——显示进程当前状态——ps u
kill——终止进程——kill -9 30142
nice——改变待执行命令的优先级——nice cc -c *.c
renice——改变已运行进程的优先级——renice +20 32768
命令——功能描述——示例
date——显示系统的当前日期和时间——date
cal——显示日历——cal 8 1996
time——统计程序的执行时间——time a.out
命令——功能描述——示例
telnet——远程登录——telnet hpc.sp.net.e.cn
rlogin——远程登录——rlogin hostname -l username
rsh——在远程主机执行指定命令——rsh f01n03 date
ftp——在本地主机与远程主机之间传输文件——ftp ftp.sp.net.e.cn
rcp——在本地主机与远程主机 之间复制文件——rcp file1 host1:file2
ping——给一个网络主机发送 回应请求——ping hpc.sp.net.e.cn
mail——阅读和发送电子邮件——mail
write——给另一用户发送报文——write username pts/1
mesg——允许或拒绝接收报文——mesg n
命令——功能描述——示例
history——列出最近执行过的 几条命令及编号——history
r——重复执行最近执行过的 某条命令——r -2
alias——给某个命令定义别名——alias del=rm -i
unalias——取消对某个别名的定义——unalias del
命令——功能描述——示例
uname——显示操作系统的有关信息——uname -a
clear——清除屏幕或窗口内容——clear
env——显示当前所有设置过的环境变量——env
who——列出当前登录的所有用户——who
whoami——显示当前正进行操作的用户名——whoami
tty——显示终端或伪终端的名称——tty
stty——显示或重置控制键定义——stty -a
——查询磁盘使用情况—— -k subdir
df——显示文件系统的总空间和可用空间——df /tmp
w——显示当前系统活动的总信息——w
命令——功能描述——示例
sudo —— 获取root权限 —— sudo -s
Ctr + D / exit —— 退出root权限
clear ——清除屏幕或窗口内容
ping —— 给网络主机发送回应请求 —— ping www..com
man —— 查看命令说明 —— man ls
q —— 退出查看的命令说明
which —— 查看指定程序的路径 —— which python
history —— 列出最近执行过的命令及编号
hostname —— 电脑在网络中的名称
env —— 显示当前所有设置过的环境变量
passwd —— 修改用户密码
date —— 显示系统的当前日期和时间 —— date
cal —— 显示日历 —— cal
time —— 统计程序的执行时间 —— time
所以你可以使用▲(上箭头)或▼(下箭头)来上下移动,
使用空格键 来翻页,输入/和关键字来按照关键字搜索
按Q来退出使用指南页面
tab按键自动补全唯一路径
中止一个错误的或者发疯的命令,可以使用组合键control + C。
你可以在执行前编辑命令,只需要使用箭头和键盘上的其他字母。
没有输入任何命令时,你可以用▲和▼来浏览历史命令。同样可以编辑和再次执行。
你也可以使用history命令查看历史记录。
你可以使用组合键control + L清屏。
细节:vim 编辑器 i 进入插入模式 ,在编辑完后按 esc,然后按Shift+":",这个时候输入wq保存退出。 (注意需要:符号)
6. python 怎么合并多行为一行
#readdatafromfile
withopen("data_src.txt",'rt')assrc:
data=[ln.strip()forlninsrc]
#','join
withopen("data_sto.txt",'wt')assto:
sto.write(','.join(list(set(data))))
python 中 set 是 “unordered collection of unique elements” 可以自动实现剔除重复数据。
7. python运维自动化取页面数据
1、linux系统基础,这个不用说了,是基础中的基础,连这个都不会就别干了,参考书籍,可以看鸟哥linux基础篇,至少要掌握这书60%内容,没必须全部掌握,但基本命令总得会吧
2、网络服务,服务有很多种,每间公司都会用到不同的,但基础的服务肯定要掌握,如FTP, DNS,SAMBA, 邮件, 这几个大概学一下就行,LAMP和LNMP是必须要熟练,我所指的不是光光会搭建,而是要很熟悉里面的相当配置才行,因为公司最关键的绝对是WEB服务器,所以nginx和apache要熟悉,特别是nginx一定要很熟悉才行,至少有些公司还会用tomcat,这个也最好学一下。其实网络服务方面不用太担心,一般公司的环境都已经搭建好,就算有新服务器或让你整改,公司会有相应的文档让你参照来弄,不会让你乱来的,但至少相关的配置一定要学熟,而且肯定是编译安装多,那些模块要熟悉一下他的作用,特别是php那些模块。
这面2点只是基础,也是必要条件,不能说是工具,下以才是真正的要掌握的工具。
3、shell脚本和另一个脚本语言,shell是运维人员必须具备的,不懂这个连入职都不行,至少也要写出一些系统管理脚本,最简单也得写个监控CPU,内存比率的脚本吧,这是最最最基本了,别以为会写那些猜数字和计算什么数的,这些没什么作用,只作学习意义,写系统脚本才是最有意义,而另一个脚本语言是可选的,一般是3P,即python, perl和php,php就不需要考虑了,除非你要做开发,我个人建议学python会比较好,难实现自动化运维,perl是文本处理很强大,反正这两个学一个就行了。
4、sed和awk工具,必须要掌握,在掌握这两个工具同时,还要掌握正则表达式,这个就痛苦了,正则是最难学的表达式,但结合到sed和awk中会很强大,在处理文本内容和过滤WEB内容时十分有用,不过在学shell的同时一般会经常结合用到的,所以学第3点就会顺便学第4点。
5、文本处理命令,sort , tr , cut, paste, uniq, tee等,必学,也是结合第3点时一并学习的。
6、数据库,首选mysql,别问我为什么不学sqlserver和oracle,因为linux用得最多绝对是mysql,增删改查必学,特别要学熟查,其它方面可能不太需要,因为运维人员使用最多还是查,哪些优化和开发语句不会让你弄的。
7、防火墙,不学不行,防火墙也算是个难点,说难不难,说易不易,最重要弄懂规则,如果学过CCNA的朋友可能会比较好学,因为iptables也有NAT表,原理是一样的,而FILTER表用得最多,反正不学就肯定不合格。
8、监控工具,十分十分重要,我个人建议,最好学这3个,cacti,nagios,zibbix,企业用得最多应该是nagios和 zibbix,反正都学吧,但nagios会有点难,因为会涉及到用脚本写自动监控,那个地方很难。