『壹』 linux print命令
具體參數及講解如下:
print命令的格式是:
print xxx
p xxx
1. print 操作符
@
是一個和數組有關的操作符,在後面會有更詳細的說明。
::
指定一個在文件或是一個函數中的變數。
{}
表示一個指向內存地址的類型為type的一個對象。
2. 察看內容
全局變數(所有文件可見的)
靜態全局變數(當前文件可見的)
局部變數(當前Scope可見的)
如果你的局部變數和全局變數發生沖突(也就是重名),一般情況下是局部變數會隱藏全局變數。如果此時你想查看全局變數的值時,你可以使用「::」操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x
註:如果你的程序編譯時開啟了優化選項,那麼在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。對付這種情況時,需要在編譯程序時關閉編譯優化。GCC,你可以使用「-gstabs」 選項來解決這個問題。
3. 察看數組
(1)動態數組:
p *array@len
array:數組的首地址,len:數據的長度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}
(2)靜態數組
可以直接用print數組名,就可以顯示數組中所有數據的內容了。
4. 輸出格式
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
5. 察看內存
使用examine(簡寫x)來查看內存地址中的值。語法:
x/
n、f、u是可選的參數。
(1)n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
(2)f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
(3)u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。
eg:
x/3uh 0x54320 :從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。
6. 察看寄存器
(1)要查看寄存器的值,很簡單,可以使用如下命令:
info registers
(2)查看寄存器的情況。(除了浮點寄存器)
info all-registers
(3)查看所有寄存器的情況。(包括浮點寄存器)
info registers
(4)查看所指定的寄存器的情況。
寄存器中放置了程序運行時的數據,比如程序當前運行的指令地址(ip),程序的當前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個$符號就可以了。如:p $eip。
7. display自動顯示的變數
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的環境變數,表示著指令的地址,/i則表示輸出格式為機器指令碼,也就是匯編。於是當程序停下後,就會出現源代碼和機器指令碼相對應的情形,這是一個很有意思的功能。
(2)其他
undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內的編號,可以用減號表示(如:2-5)
disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。
info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。
8. 設置
(1)set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。
(2)set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。
(3)set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。
(4)set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。
(5)set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。如:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
(6)set print union
設置顯示結構體時,是否顯式其內的聯合體數據。
(7)set print object
在C++中,如果一個對象指針指向其派生類,如果打開這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。
『貳』 linux操作系統利用find 命令如何查找某個目錄的位置
1、linux命令如果記不得,可以使用man命令來查看某個命令的使用。但對應初學者往往看不懂或者不知道什麼場景下使用
(2)linuxprint0擴展閱讀
Linux簡介:
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。
Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。
嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU工程各種工具和資料庫的操作系統。
『叄』 linux自動清理日誌的方法分享
1.做自動部署系統時精簡的一個腳本,主要功能是清理所有目錄的日誌
2.根據給定日誌目錄,刪除時間 結合crontab進行清理日誌,清理完成後,後在/var/log/deltelog/ 生成按照月的清理日誌
3.擴展,因為腳本採用mtime(最後修改時間)進行刪除,所以可以適用於刪除過期備份等,不受文件名稱的限制
shell小竅門
find –type f –print 時會根據換行或者空格來輸出查找的文件,在不同的sh下有不同的`反應,如果不做處理結合xargs 進行刪除 更改操作,會有影響
所以需要增加 –print0 用 null來 作為邊界符號,才敢結婚 xargs –o 來格式化輸入
使用find 的時候 遵循最小結果集原則,find解析式從左到右,所有確保你在最左邊的過濾符號能夠過濾最大數據
你可以根據你的需要增加到crontab中
shell腳本
復制代碼 代碼如下:
#!/bin/sh
###########################
# log blog.plicatedcode.com
# in_day_num: like 1 2 is 2day ago logs
# in_log_path like tomcat log home
###########################
in_log_path=${1}
in_day_num=${2}
tmp__log=/var/log/log/"`date +%Y%m`.log"
Log()
{
inner_num=${1}
#find log
echo "[`date`] >> start logs---" >> $tmp__log
find ${in_log_path} -type f -mtime ${inner_num} -print0 | xargs -0 rm -rf
echo "[`date`] >> end logs---" >> $tmp__log
}
init()
{
mkdir -p /var/log/log/
}
main()
{
init
if [ -z ${in_log_path} ];then
echo "[`date`] >> error log_path not init---" >> $tmp__log
return
fi
inner_day_num=+7
if [[ -n ${in_day_num} ]] && [[ ${in_day_num} -ge 1 ]] ; then
${inner_day_num}=${in_day_num}
fi
Log ${inner_day_num}
}
main
『肆』 linux:命令行中對文件進行編輯後怎麼退出到命令行界面
如果在命令行下使用gedit, 關閉程序窗口(一般先保存文件),就自動退到命令行界面。
如果在命令行下使用vim,先按下ESC退出編輯模式,然後輸入:wq 保存並退出或者q退出或者q!強制退出,從而回到命令行界面。
(4)linuxprint0擴展閱讀:
linux常見命令:
命令
apropos whatis 顯示和word相關的命令。 參見線程安全
man-t man | ps2pdf - > man.pdf 生成一個PDF格式的幫助文件
which command 顯示命令的完整路徑名
time command 計算命令運行的時間
time cat 開始計時. Ctrl-d停止。參見sw
niceinfo 運行一個低優先順序命令(這里是info)
renice 19 -p $$ 使腳本運行於低優先順序。用於非交互任務。
目錄操作
cd - 回到前一目錄
cd 回到用戶目錄
(cd dir && command) 進入目錄dir,執行命令command然後回到當前目錄
pushd. 將當前目錄壓入棧,以後你可以使用popd回到此目錄
文件搜索
aliasl='ls -l --color=auto' 單字元文件列表命令
ls -lrt 按日期顯示文件. 參見newest
ls /usr/bin | pr -T9 -W$COLUMNS 在當前終端寬度上列印9列輸出
find -name '*.[ch]' | xargs grep -E 'expr' 在當前目錄及其子目錄下所有.c和.h文件中尋找'expr'. 參見findrepo
find -type f -print0 | xargs -r0 grep -F 'example' 在當前目錄及其子目錄中的常規文件中查找字元串'example'
find -maxdepth 1 -type f | xargs grep -F 'example' 在當前目錄下查找字元串'example'
find -maxdepth 1 -type d | whilereaddir; do echo $dir; echo cmd2; done 對每一個找到的文件執行多個命令(使用while循環)
find -type f ! -perm -444 尋找所有不可讀的文件(對網站有用)
find -type d ! -perm -111 尋找不可訪問的目錄(對網站有用)
locate -r 'file[^/]*.txt' 使用locate 查找所有符合*file*.txt的文件
look reference 在(有序)字典中快速查找
grep--colorreference /usr/share/dict/words 使字典中匹配的正則表達式高亮
歸檔 and compression
gpg -c file 文件加密
gpg file.gpg 文件解密
tar -c dir/ | bzip2 > dir.tar.bz2 將目錄dir/壓縮打包
bzip2 -dc dir.tar.bz2 | tar -x 展開壓縮包 (對tar.gz文件使用gzip而不是bzip2)
tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' 目錄dir/壓縮打包並放到遠程機器上
find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 將目錄dir/及其子目錄下所有.txt文件打包
find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents 將目錄dir/及其子目錄下所有.txt按照目錄結構拷貝到dir_txt/
( tar -c /dir/to/ ) | ( cd /where/to/ && tar -x -p ) 拷貝目錄/到目錄/where/to/並保持文件屬性
( cd /dir/to/ && tar -c.) | ( cd /where/to/ && tar -x -p ) 拷貝目錄/下的所有文件到目錄/where/to/並保持文件屬性
( tar -c /dir/to/ ) | ssh -C user@remote 'cd /where/to/ && tar -x -p' 拷貝目錄/到遠程目錄/where/to/並保持文件屬性
dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz' 將整個硬碟備份到遠程機器上
『伍』 Linux下如何一條命令刪除上萬個文件
find / -name *.log | xargs -n 1000 rm -f
因為rm 接收參數的數量是有限的, 所昌兄彎以每次傳 1000個參數給他,這樣可以滿足你的需求。
補充一點,這種寫法其實不是特別嚴謹,因為如果日誌文件的塵改命名有特殊字元的話,上面命令將會對特殊字元文件識別不了。
嚴謹的寫法。
find / -name '*.log' -print0 |xargs -0 -n 1000 rm -f
這里前面的print0 和 後的-0 都是對特殊字元進行處理,也就是說他會認識如耐悶"aa bb cc " 這種文件名,多的不說了,不知你能否看明白。
『陸』 如何在Linux下用腳本移動一個名字帶有$符號的文件
樓上正解
補充一個
利用find命令
find
.
-name
"1*"
-print0|xargs
-0
-i
mv
{}
..
將1開頭的所有文件挪到上層文件夾中,這個在需要挪動大量文件的時候比較好。-name指定了文件名,如果在文件名非常非常難以輸入的時候可以不用,直接用ls
-i
查出來inode,
然後find的-inum參數即可
『柒』 Linux怎樣重新給文件夾增加空間
linux 擴展某個目錄下空間大小,方法如下:
1)新建一個有足夠空間的分區給你要搬回移的目錄,比如/home。
2 ) 新建一個答目錄。
$mkdir /mnt/newhome
3)把新建的分區掛載到新建的目錄下。
$sudo mount -t ext3 /dev/hda5 /mnt/newhome#這里假設新建的分區是ext3類型的,並且是在/dev/hda5
4)把整個/home都拷貝過去。
$cd /home/$find . -depth -print0 | cpio --null --sparse -pvd /mnt/newhome/
5)卸載 。
$sudo umount /mnt/newhome
6)把原來的/home 改名。
$sudo mv /home /old_home
7)新建一個/home。
sudo mkdir /home
8 ) 把分區掛載過來。
$sudo mount /dev/hda5 /home
9)在 「/etc/fstab」 file里加上如下代碼。
/dev/hda5 /home ext3 nodev,nosuid 0 2#讓系統啟動的時候就自動掛載。
10)把舊的home刪除。
$sudo rm -r /old_home
『捌』 linux三劍客的基本使用——grep、sed、awk
grep、sed、awk是linux功能非常強大的三個命令,grep是查找過濾文本,sed是對文本進行編輯替換,awk是對文本進行分析報告。
最簡單的理解就是找什麼東西用grep,想修改什麼內容用sed,想格式化內容用awk。
創建一個文件名為grep_text.txt的文件,並放入內容:
SillyMadman is both a madman and a fool.
Everyone agrees with this sentence.
我要查找在grep_text.txt文件里有Silly的行
命令是: grep Silly grep_text.txt
會返回內容:SillyMadman is both a madman and a fool.
也可以帶以下參數,這些我認為可能容易用到的參數,其它的參數需要另行查找
文檔,比如可以使用正則進行匹配。
內容相關的
-B, --before context=NUM顯示所在行之前的行數
-A, --after context=NUM顯示所在行之後的行數
-C, --context=NUM列印輸出上下文的行數
過濾內容相關的參數:
-i, --忽略大小寫區分
-w,--匹配查找的整個單詞
-x,--匹配查找的整行文本
-v, --過濾掉匹配的內容
輸出內容相關的參數
-n, --行號列印帶有輸出行的行號
比如,我要查找在grep_text.txt文件里不區分大小寫查找sillymadman,並顯示行號和匹配文本的下一行,那麼我可以用以下命令查找
grep sillymadman grep_text.txt -i -n -A1
內容返回為
1:SillyMadman is both a madman and a fool.
2-Everyone agrees with this sentence.
總體而言grep的使用方式就是
grep [參數...](查找的內容) (文件名)
grep也經常搭配管道符號"|"使用,比如我要查詢某程序的進程,並去掉查找進程本身,那麼命令為
ps -ef | grep program_name | grep -v grep
再創建一個文件名為sed_text.txt的文件,並放入內容:
SillyMadman is both a madman and a fool.
Everyone agrees with this sentence.
我想要在第一行下面添加一句:woshishazi
命令是:sed '1a\woshishazi' sed_text.txt
返回內容為:
SillyMadman is both a madman and a fool.
woshishazi
Everyone agrees with this sentence.
但是以上這個命令不會修改原文件,如果需要,需要加上-i
sed -i '1a\woshishazi' sed_text.txt
上面a是代表append,從指定行後面新的一行添加數據,還有其他操作
操作有以下這些
a :從下面一行新增
i :從上面一行插入,
d :刪除
c :整行替換
p :列印
s :對指定內容進行替換
下面稍微舉下例:
a: sed '1a\woshishazi' sed_text.txt 從第一行後面添加
i: sed '1i\woshishazi' sed_text.txt 從第一行前面插入
d: sed '1d' sed_text.txt 刪除第一行
c: sed '1c\woshishazi' sed_text.txt 替換第一行內容為woshishazi
p: sed -n '1p' sed_text.txt 列印第一行,一般搭配-n使用,其他內容就不會再展示
s:這個相對復雜一點需要詳細說明一下
sed的參數為 '[行]s/要被替換的內容/新的內容/g'
行是一個可選項,可以選擇具體的行進行替換
g代表替換所有匹配到的內容,也可以改為數字,表示第幾次匹配到時進行替換
sed 's\SillyMadman\shafengzi\g' sed_text.txt ,將所有SillyMadman替換為shafengzi
輸出結果為:
shafengzi is both a madman and a fool.
Everyone agrees with this sentence.
最後再創建一個文件名為awk_text.txt的文件,並放入內容:
1 a
2 b
3 c
4 d
5 f
以空白符作為分隔符這個文本相當於每一行有兩個欄位。
那麼列印第一個欄位時 awk '{print 0的話,則代表列印所有欄位
awk默認以空白符作為分隔符,也可以指定分割符通過-F
awk -F: '{print $1}' awk_text.txt,以「:」作為作為分隔符
那麼返回內容就為
1 a
2 b
3 c
4 d
5 f
相當於只有一列或者說一個欄位
然後還可以對前面加上一個正則對行進行匹配內容
awk '/a/{print 2 ~ /a/){print $1}' awk_text.txt
返回內容為
1
『玖』 linux文件許可權設置
文件的三個最基本的許可權是讀寫執行
r,讀,可以讀取文件,對目錄來說可以列出目錄的文件列表
4
w,寫,可以修改刪除文件,對目錄來說可以創建刪除文件
2
x,執行,可以執行文件,對目錄來說可以cd進入目錄
1
注意點:目錄上只有執行許可權,則可以進入或者穿越此文件夾,但是要訪問此文件夾下有讀取許可權的文件,則必須輸入文件名,只有執行許可權的文件夾,不能列出目錄,也不能刪除目錄
特殊位,SUID,SGID,stickt-bit位,如果設置了SUID的可執行文件被執行的,文件將以所有者的身份來運行。SGID,意思同SUID,sticky-bit位,盡管其他用戶有寫許可權,但是必須由屬主執行刪除和移動操作。子目錄也只有屬主可以操作。
許可權設置命令
chmod,-R,遞歸,s表示SUID或者SGID,t表示stick-bit,
chown,改變用戶屬主和組,-R遞歸,加:則是改變組,不加是改變用戶,
umask,設置文件默認生成編碼,就是創建一個新文件的時候的默認許可權,-S查看默認許可權。
find,查找文件,<起始目錄><選項表達式><條件匹配表達式><動作表達式>
選項表達式,-follow,遇到符號鏈接則跟蹤符號鏈接。-regextype指定-regex和-iregex使用的正則表達式的類型,-depth,查找子目錄之前先查找完當前目錄,-mount,不跨越文件系統,-xdev,同-mount,-maxdepth,最大深度查詢,
條件匹配表達式,-name
匹配文件名
-iname匹配文件名不區分大小寫,
-lname匹配符號鏈接文件名,
-ilname匹配符號鏈接文件名不區分大小寫,-path路徑,-regex,正則匹配,-iregex,正則匹配,不區分大小寫,-amin
N查找N分鍾之前被訪問過的所有文件,-atime
N
查找N天之前被訪問的文件,-cmin,和-ctime是文件狀態被修改過的(比如許可權),-mmin和-mtime是文件內容被修改過的,-uid
N查找uid是N的文件,-gid,查找gid是N的所有的文件,-inum,查找i-node是N的文件,-links
N,查找硬鏈接為N的文件,-size
N[bcwkMG]按照大小查找,-perm
MODE按照許可權查找,
-perm
-MODE,按照最低許可權查找,
-anewer
file,查找比file訪問時間新的文件,
-cnewer查找比fule新的修改時間的文件,
-newer
file查找比file新的內容修改過的文件,
-fstype指定類型的文件系統,-type指定文件類型,-empty內容為空,-user
NAME,按照用戶查找,-group按照組查找,-nouser,文件不屬於/etc/passwd中的用戶,-nogroup,文件不屬於/etc/group中的組
動作表達式,-print,每行一個文件,-print0取消間隔符。
grep
[options]
PATTERN
[FIFL...]所有文本內容,把匹配的行列印出來,-c只顯示匹配的次數,-i搜索時不區分大小寫,-n匹配行的行號,-v輸出不匹配的行,-A同時顯示匹配到的行後面的N行,-B匹配輸出行前面幾行,-C匹配輸出行前後各幾行,