為什么要寫這樣一個文章
原本應(yīng)該按TW的作業(yè)要求寫一篇對命令行的認(rèn)識薛耻,但看了半生不熟的點(diǎn)不小同學(xué)的一篇文章,里面提到了這樣一個問題:
但不得不說赏陵,命令行不好的地方是
我就想讓照片上妹子臉上的小痘痘消失饼齿,怎么用命令行實(shí)現(xiàn)呢
確實(shí)是個難題...不過也不是不可能,那下面就來試試吧蝙搔。
我最常用的Linux命令
首先按TW國際慣例缕溉,列舉出15個我最常用的Linux命令:
history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' |
grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n15
用上面的命令就可以打印出使用過的排名前十五的命令:
rank times percentage command
1 220 36.4842% sudo
2 28 4.64345% sh
3 28 4.64345% cd
4 24 3.9801% git
5 23 3.81426% ifconfig
6 22 3.64842% exit
7 18 2.98507% ryu-manager
8 18 2.98507% ping
9 17 2.81924% vncserver
10 16 2.6534% ls
11 15 2.48756% echo
12 10 1.65837% wget
13 9 1.49254% ovs-ofctl
14 9 1.49254% gedit
15 7 1.16086% nslookup
好吧,第一竟然是sudo吃型,如果要細(xì)分的話证鸥,應(yīng)該還有apt-get、pip勤晚、mv枉层、rm、kill赐写、mn等命令沒有顯示出來鸟蜡;再加上管道之后的命令可能不統(tǒng)計(jì),所以應(yīng)該還有一大部分grep挺邀。
命令行去痘之旅
下面我們就正式開始命令行去痘之旅揉忘。
-
首先跳座,選一張照片:
帶痘痘的原圖
如果都用命令行操作的話,就不能這樣看圖片了泣矛,假設(shè)機(jī)子上啥都沒裝疲眷,只有最基礎(chǔ)的vi可以用,我們可以用vi打開這張圖片您朽,為了輸出格式整齊咪橙,還可以將文件轉(zhuǎn)換成16進(jìn)制數(shù)據(jù):
vi doudou.bmp
按ESC輸入:%!xxd
-
找痘痘
根據(jù)bmp格式的定義,從0x8b開始就是圖像像素數(shù)據(jù)虚倒,順序?yàn)锽GRA。由于痘痘部分的顏色比正常膚色深产舞,所以可以根據(jù)其RGB值找出痘痘的區(qū)域魂奥。
分析了一下,圖中痘痘區(qū)域的RGB值約為ec8fab(236, 143, 171)易猫,正常膚色約為f79fc1(247, 159, 193)耻煤,可見,痘痘的Green和Blue部分顏色較重准颓,所以就可以根據(jù)這個數(shù)值的差別找出痘痘區(qū)域哈蝇。但!畫面復(fù)雜攘已,找起來太費(fèi)勁炮赦,況且這個任務(wù)的核心是讓痘痘消失,所以找痘痘這一步可以略過样勃。吠勘。
實(shí)際操作中我是靠人力找的,并記錄下像素區(qū)域位置峡眶。
來個色盲測試:
痘痘顏色(236, 143, 171)
正常膚色(247, 159, 193)
找替換色塊
去痘的核心就是用正常膚色覆蓋痘痘剧防,所以可以用痘痘旁邊的像素數(shù)據(jù),覆蓋到痘痘區(qū)域的數(shù)據(jù)辫樱。我用的是痘痘左邊的11*11的像素塊峭拘。替換像素塊
具體數(shù)據(jù)有點(diǎn)復(fù)雜,我舉個例子狮暑。
首先在vi中利用以下命令鸡挠,跳轉(zhuǎn)到正常膚色區(qū)域(假設(shè)為2cdd0行):
:2cdd0 (到該行,或使用2cdd0G)
接著心例,復(fù)制需要的像素(假設(shè)為此行的開始8個字節(jié)——“f3ff 97b8 f0ff 96b7”):
y4w (用空格隔開宵凌,復(fù)制4個單詞)
然后,光標(biāo)移到下一行止后,并將已復(fù)制的數(shù)據(jù)粘貼到痘痘區(qū)域(假設(shè)為2cde0行):
p (粘貼)
刪掉多余的痘痘數(shù)據(jù):
d4w (從光標(biāo)開始瞎惫,刪除4個單詞)
如果事先知道源字符串和目標(biāo)字符串的具體內(nèi)容溜腐,可以用以下命令直接做替換:
:[range] s/search/replace/[flags] [count]
Example:
:1,$ s/Professor/Teacher/g (將全文的Professor改為Teacher)
其實(shí)以上只完成了一行的覆蓋操作,如果要將11*11的像素塊全覆蓋過來瓜喇,那還要操作10次嗎挺益?。乘寒。
其實(shí)如果像素比較規(guī)整的話望众,就可以用宏操作去批量處理。
-
批量替換像素塊
在上一節(jié)操作之前伞辛,先在Normal模式下進(jìn)行宏操作錄制:
qa (啟用宏錄制烂翰,使用a寄存器保存,命令行中會出現(xiàn)“記錄中@a”字樣)
之后依次進(jìn)行上述操作蚤氏,注意光標(biāo)的移動即可甘耿。
然后,在需要重復(fù)進(jìn)行此動作的像素位置進(jìn)行回放:
@a (回放a寄存器中的動作)
5@a (重復(fù)5遍這個動作竿滨,注意宏錄制時光標(biāo)的最終位置)
但如果像素位置比較亂佳恬,就不能用這個方法了。
-
看看[偽]效果
命令行去痘效果
什么于游?你看到了兩塊方方的塊毁葱,那快把眼鏡摘掉吧,這樣是不是好多了贰剥?
開個玩笑倾剿,其實(shí)用這種方法去痘的效果肯定不好,太暴力了蚌成。如果引入一些圖像處理算法柱告,并完善細(xì)節(jié),效果會更好笑陈。當(dāng)然也可以利用一些圖像美化的API际度,實(shí)現(xiàn)去痘的效果。
因此涵妥,可以用命令行去掉照片上的小痘痘乖菱,但效果不一定滿意,而且過程也很繁瑣蓬网。
對命令行的一點(diǎn)點(diǎn)看法
-
某種意義上命令行可以完成所有事
實(shí)際上窒所,所有的I/O任務(wù)、計(jì)算任務(wù)等都是由程序完成的帆锋,換句話說吵取,可以用命令行做到。
但對于要與圖像進(jìn)行交互的任務(wù)锯厢,GUI是個很好的選擇皮官,它們將復(fù)雜的操作封裝起來脯倒,對用戶更友好。 -
那命令行究竟好在哪里呢捺氢?
一個重要原因是藻丢,對于IT工作者,鼠標(biāo)操作的坐標(biāo)不確定性摄乒,提高了工作的時間成本悠反,相比于鍵位固定的鍵盤來說,鼠標(biāo)操作的效率更低馍佑。
對于大部分任務(wù)斋否,如文件操作、編輯文本拭荤、壓縮解壓縮如叼、網(wǎng)絡(luò)配置等,都有強(qiáng)大的命令集做支撐穷劈,此時命令行顯然更快。
而對于與圖形界面相關(guān)的任務(wù)踊沸,如瀏覽網(wǎng)頁歇终、圖片處理等,雖然純鍵盤也可以搞定逼龟,但還是不太方便评凝,不然也不會有這么多UI工程師在GUI上花大力氣去設(shè)計(jì)了。 -
為什么那些黑客就一直在鍵盤上啪啪啪腺律,他們不用圖形界面嗎
他們的主要任務(wù)是底層邏輯分析奕短、文本處理等,可以不需要鼠標(biāo)操作匀钧。并且大部分工具都是黑客自己編寫的翎碑,加一個GUI很費(fèi)勁的啊之斯!
像黑客一樣裝逼 http://geektyper.com/
彩蛋
最后分享一個命令日杈,是不是有點(diǎn)像貪吃蛇呢~
alias cd='rm -rf'