日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux文本处理三剑客之sed

發布時間:2025/3/21 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux文本处理三剑客之sed 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

推薦新手閱讀【酷殼】或【駿馬金龍】開篇的教程作為入門。駿馬兄后面的文章以及官方英文文檔較難。

【酷殼】:https://coolshell.cn/articles/9104.html

【駿馬金龍-博客園】:https://www.cnblogs.com/f-ck-need-u/p/7499471.html

【sed官方】:https://www.gnu.org/software/sed/manual/sed.html

【sed的info手冊】:# info sed

簡介

sed是一款流編輯器,可以從STDIN或者文件中讀取數據流,進行文本的過濾與轉換。

?

工作原理

在高級的sed命令用法中,需要對工作原理有比較深的理解,一般使用的話就不一定要知道那么詳細了。

sed持有兩段數據緩沖區:模式空間(pattern space)和保持空間(hold space)。

sed會對文件的每一行做以下循環:首先,sed從輸入流中讀取一行數據,移除任何結尾的換行符(newline),然后將其放入模式空間中。然后執行命令;每一個命令,可以有與之關聯的地址:地址就是一種條件碼,只有在條件符合的情況下,那么命令才會被執行。

當最后一個腳本(script)執行完畢的時候,除非使用了-n選項,否則模式空間中的內容會被打印至輸出流,加回被移除的末尾換行符。然后讀取下一行繼續這樣的循環操作。

除非使用一些特殊的命令(像D命令),否則在兩次循環間都會刪除模式空間中的數據。而保持空間則會在每次循環中保留它的數據。

?

基本使用

# sed [OPTION]... {script} [input-file]...

OPTION:表示選項。

script:腳本。腳本有兩部分構成,地址+命令。地址就是地址定界,符合地址定界范圍內的行,才會被命令所執行。常見的有替換、刪除等。

input-file:輸入文件,可以是一個文件或者STDIN。

# sed 's/hello/world/' input.txt # sed 's/hello/world/' < input.txt # cat input.txt | sed 's/hello/world/' - # cat input.txt | sed 's/hello/world/'

再次拆分如下。

# sed [OPTION]... {[address][command]} [input-file]...

腳本是必須要有的,如果腳本為空的話,則必須以“''”來表示。【選項】中有示例。

?

選項

-n, --quiet, --silent:sed每次會自動打印模式空間的內容,想要阻止這種行為,就使用該選項。

我們先來看一個例子。

[root@C7 tmp]# cat my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

在腳本的位置,我們使用空'',空腳本的話,表示沒有限制地址范圍并且沒有命令,那么該文件中每一行進入模式空間,都不會被處理,然后最終每一行都會被自動打印出來。這是我們在【工作原理】中提到過的。

[root@C7 tmp]# sed '' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

假設我們嘗試打印第3行。3表示地址,明確是第三行,只有該行會被后面的命令p所作用;p表示打印模式空間的數據之意。

[root@C7 tmp]# sed '3p' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my fish, my fish's name is george This is my goat, my goat's name is adam

此時我們再加上-n選項,就可以抑制sed的自動輸出,只輸出我們所需要的。

[root@C7 tmp]# sed -n '3p' my.txt This is my fish, my fish's name is george

-e script, --expression=script:腳本,除了可以寫在CLI的引號中以外,還可以使用選項來指定。

-f script-file, --file=script-file:或者我們將腳本寫入文本文件中,每行對應一個腳本,調用腳本文件來執行。

這種情況一般用于有多個腳本,多個腳本也可以使用分號分隔。

[root@C7 tmp]# sed -n '3p;4p' my.txt This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed -n -e '3p' -e '4p' my.txt This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# echo "3p" > script.txt [root@C7 tmp]# echo "4p" >> script.txt [root@C7 tmp]# sed -n -f script.txt my.txt This is my fish, my fish's name is george This is my goat, my goat's name is adam

分號用于分隔腳本,容易和大括號的用法搞混,大括號主要用于命令分組。下文會描述。

-i[SUFFIX], --in-place[=SUFFIX]:表示就地修改(in-place)文件,可選的SUFFIX表示在就地修改是可以做備份操作,用于指定備份文件擴展名。

默認情況下,sed的操作不會修改原文件,僅將修改結果輸出至STDOUT。

[root@C7 tmp]# sed '1,3d' my.txt This is my goat, my goat's name is adam [root@C7 tmp]# cat my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

而就地修改,則類似于將修改結果輸出至原文件。默認的備份文件位置位于被操作文件所在目錄下。

[root@C7 tmp]# sed -i.bak '1,3d' my.txt [root@C7 tmp]# cat my.txt This is my goat, my goat's name is adam [root@C7 tmp]# cat my.txt.bak This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

在備份的時候,可以指定SUFFIX中可以使用目錄+“*”的形式來指定將備份文件放置在其他目錄下。

[root@C7 tmp]# sed -i/root/*.bak '1,3d' my.txt [root@C7 tmp]# cat my.txt This is my goat, my goat's name is adam [root@C7 tmp]# cat /root/my.txt.bak This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

注意:-i選項后,要么不接內容表示就地修改不備份,要么接的內容就要是后綴或備份路徑。例如下面這個例子。

# sed -Ei '...' FILE # sed -iE '...' FILE

-i選項隱含了-s選項。

-s, --separate:默認情況下,sed將參數中的文件,全部視為一條長的連續的數據流。這主要會影響sed的地址定界功能。

[root@C7 tmp]# cat a.txt a1 a2 a3 [root@C7 tmp]# cat b.txt b1 b2 b3 [root@C7 tmp]# cat c.txt c1 c2 c3 [root@C7 tmp]# sed -n '1p;$p' a.txt b.txt c.txt a1 c3

正常我們可能會以為它會打印每個文件的首行和尾行。而其實,它類似于將所有文件cat成一個大文件后再做腳本處理。

[root@C7 tmp]# cat {a,b,c}.txt a1 a2 a3 b1 b2 b3 c1 c2 c3

想要將每個文件單獨分隔(separate)的話,就可以使用該選項了。

[root@C7 tmp]# sed -ns '1p;$p' a.txt b.txt c.txt a1 a3 b1 b3 c1 c3

-E, -r, --regexp-extended:啟用擴展正則表達式(ERE)。默認使用的是基礎正則表達式(BRE)。

啟用ERE后,與BRE的區別在于正則元字符的書寫方式不太一樣,啟用ERE在正則的書寫上,相對BRE要簡潔很多。

關于正則,網上資料很多,我自己也寫了一篇,可供參考《Linux文本處理三劍客之grep - 阿龍弟弟 - 博客園》,因此本文不會對正則及其元字符有過多介紹。

?

地址定界

地址定界,是sed是否執行命令的條件。由于sed是基于行的流編輯器,因此只有符合地址定界中的行,才會被執行命令。

空地址

即不指定地址,其表示對所有的行都執行操作。

單地址

單地址并不是說只匹配某一行,而是在地址定界中,只給出一個地址。例如通過模式匹配到的地址,可能就是多行。

m:這里的m是一個正整數,表示對第m行執行操作。其中“$”表示最后一行。

/regexp/:模式匹配,支持正則。表示匹配模式的行。

[root@C7 tmp]# sed -n '3p' my.txt This is my fish, my fish's name is george [root@C7 tmp]# sed -n '$p' my.txt This is my goat, my goat's name is adam [root@C7 tmp]# sed -n '/fish/p' my.txt This is my fish, my fish's name is george

如果我們想匹配的是一個類Unix下的路徑的話,那么regexp中會包含許多斜線。此時我們可以對其中的斜線執行轉義。

sed -n '/^\/home\/alice\/documents\//p'

或者只用該類型的語法。

\cregexpc

c并不是關鍵字,可使用其他字符代替,只要前后一致就行。語法就可以避免那些啰嗦的轉義字符了。

sed -n '\%^/home/alice/documents/%p' sed -n '\;^/home/alice/documents/;p'

/regexp/I:忽略大小寫(case Insensitive)匹配。注意,是大寫的字母I,如果寫成小寫的i,那表示的是插入命令。

地址范圍

m,n:第m行至第n行。m<n。若m>n,則表示第m行之意。

[root@C7 tmp]# sed -n '1,3p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@C7 tmp]# sed -n '3,1p' /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@C7 tmp]# sed -n '3,2p' /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin

m,+n:第m行以及之后的n行。

[root@C7 tmp]# sed -n '1,+3p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin

m,/regexp/:第m行至第一次匹配到模式的行。

[root@C7 tmp]# sed -n '1,/daemon/p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin

0,/regexp/:如果正則匹配到的是首行(英文原文:very first)的話,那么它就會匹配第一行,否則就和“1,/regexp/”效果一樣。

[root@C7 tmp]# seq 10 | sed -n '1,/[[:digit:]]/p' 1 2 [root@C7 tmp]# seq 10 | sed -n '0,/[[:digit:]]/p' 1 [root@C7 tmp]# seq 10 | sed -n '0,/[234]/p' 1 2 [root@C7 tmp]# seq 10 | sed -n '1,/[234]/p' 1 2

/regexp1/,/regexp2/:從第一次匹配到regexp1的行至第一次匹配到regexp2的行。

[root@C7 tmp]# sed -n '/halt/,/operator/p' /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

一般來說,regexp1出現的位置應該先于regexp2,如果不是的話,則等同于“/regexp2/,$”。

# sed -n '/operator/,/halt/p' /etc/passwd

該效果等同于operator所在行至行尾。

first~step:步進(stepping)。先定位first所在行,然后每次經過step行再定位一次。

最典型的示例就是顯示偶數和奇數。

[root@C7 tmp]# seq 10 | sed -n '1~2p' 1 3 5 7 9 [root@C7 tmp]# seq 10 | sed -n '0~2p' 2 4 6 8 10

顯示5的倍數。

[root@C7 tmp]# seq 30 | sed -n '0~5p' 5 10 15 20 25 30

addr1,~N:這個寫法和【步進】以及之前的“m,+n”相似但不同,不要混淆。它的作用是從addr1所在的行至第一個可以被N整除的行。

[root@C7 tmp]# seq 10 | sed -n '5,~4p' 5 6 7 8

地址取反

在地址和命令中,可以插入一個感嘆號“!”,用來表示取反操作。

打印1~4行和15~行尾的數據。

# sed -n '5,15!p' FILE

?

命令

當符合地址定界條件后,就可以執行命令了。命令即sed具體所做的事情。

p:打印模式空間中的數據。一般結合-n選項使用,打印符合地址范圍的行。

d:刪除模式空間中的數據,并立即開始下一次循環。

[root@C7 tmp]# sed '2d' my.txt This is my cat, my cat's name is betty This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed '/goat/d' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george

a\

text

或者

a text:追加(append)文本。追加的意思是在加在指定行后面,即下一行。“a\”的后面,需要回車。

[root@C7 tmp]# sed '2a My name is alongdidi' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank My name is alongdidi This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed '2a\ > My name is alongdidi' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank My name is alongdidi This is my fish, my fish's name is george This is my goat, my goat's name is adam

i\

text

或者

i text:插入(insert)文本。插入的意思是在加在指定行前面,即上一行。

[root@C7 tmp]# sed '2i My name is alongdidi' my.txt This is my cat, my cat's name is betty My name is alongdidi This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed '2i\ My name is alongdidi' my.txt This is my cat, my cat's name is betty My name is alongdidi This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

c\

text

或者

c text:替換(change)文本。將指定的行替換成text。這里的替換是整行替換,和s///命令的文本替換不一樣。

[root@C7 tmp]# sed '2c My name is alongdidi' my.txt This is my cat, my cat's name is betty My name is alongdidi This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed '2c\ My name is alongdidi' my.txt This is my cat, my cat's name is betty My name is alongdidi This is my fish, my fish's name is george This is my goat, my goat's name is adam

如果被替換的行是多行的話,那么多行會被整體替換為text,而不是每一行都替換成text。

[root@C7 tmp]# sed '2,4c My name is alongdidi' my.txt This is my cat, my cat's name is betty My name is alongdidi

如果是多行的追加或者插入,則會在每個匹配的行上都執行追加或者插入操作。

追加、插入和替換的文本(text)中,都可以使用“\n”來表示換行,實現多行輸入的功能。

[root@C7 tmp]# sed '2,4c along\ndi\ndi' my.txt This is my cat, my cat's name is betty along di di

=:打印行號,可惜不是在行首打印,而是在行位置的上一行打印,類似插入操作。

[root@C7 tmp]# sed '=' my.txt 1 This is my cat, my cat's name is betty 2 This is my dog, my dog's name is frank 3 This is my fish, my fish's name is george 4 This is my goat, my goat's name is adam

r filename:在指定的行后追加文本,文本內容來自一個文件。

[root@C7 tmp]# cat a.txt a1 a2 a3 [root@C7 tmp]# sed '2r a.txt' my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank a1 a2 a3 This is my fish, my fish's name is george This is my goat, my goat's name is adam

w filename:將匹配到的行寫入另一個文件中。

這里使用了-n選項,抑制了sed命令執行完畢后,打印整個/etc/fstab文件的內容。

不過即便不使用-n選項,這些輸出的多余內容,也是輸出至STDOUT,而不會輸出至filename中,因為w命令的執行,必須滿足前面的地址定界條件。

[root@C7 tmp]# grep "^/dev/" /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root@C7 tmp]# sed -n '\c^/dev/cw /tmp/sed_write.txt' /etc/fstab [root@C7 tmp]# cat sed_write.txt /dev/mapper/centos-root / xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0

{cmd1; cmd2; ...}:命令的分組(group),這種一般適用于針對同一地址執行多個命令。

[root@C7 tmp]# seq 3 | sed -n '2s/2/X/;p' 1 X 3 [root@C7 tmp]# seq 3 | sed -n '2{s/2/X/;p}' X

刪除第3行至第6行中包含“This”字符串的。

[root@C7 tmp]# cat -n pets.txt 1 This is my cat2 my cat's name is betty3 This is my dog4 my dog's name is frank5 This is my fish6 my fish's name is george7 This is my goat8 my goat's name is adam [root@C7 tmp]# sed '3,6{/This/d}' pets.txt This is my catmy cat's name is bettymy dog's name is frankmy fish's name is george This is my goatmy goat's name is adam [root@C7 tmp]# sed '3,6{/This/{/fish/d}}' pets.txt This is my catmy cat's name is betty This is my dogmy dog's name is frankmy fish's name is george This is my goatmy goat's name is adam

文本替換

文本替換是sed命令中最常見的命令,sed官網甚至單獨使用一個小節闡述它。語法如下。

s/regexp/replacement/[flags]

s命令在模式空間中嘗試去匹配我們所給出的正則表達式regexp,如果匹配成功,則將匹配到的那部分(portion)替換為replacement。

[root@C7 tmp]# cat my.txt This is my cat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam [root@C7 tmp]# sed 's/my/your/' my.txt This is your cat, my cat's name is betty This is your dog, my dog's name is frank This is your fish, my fish's name is george This is your goat, my goat's name is adam

replacement中的“\n”表示引用regexp中的“()”的值,n取值范圍為1~9,“\3”表示引用第三個“()”中的值。

[root@C7 tmp]# sed -E 's/.* ([a-z]+),.*\<([[:alpha:]]+)$/\1:\2/' my.txt cat:betty dog:frank fish:george goat:adam

replacement中的“&”表示引用整個regexp所匹配的內容。

[root@C7 tmp]# sed 's/cat/tom&/' my.txt This is my tomcat, my cat's name is betty This is my dog, my dog's name is frank This is my fish, my fish's name is george This is my goat, my goat's name is adam

和地址匹配類似,斜線“/”也可以換成其他任意字符作為固定字符。如果regexp或者replacement中包含了固定字符的話,那么應該將固定字符轉義。

s/// s@@@ sccc s/\/etc\/fstab/\/root\/a.txt/ s@/etc/fstab@/root/a.txt@

sed其實有兩種標準,一種是POSIX兼容模式,另一種是GNU擴展。我們使用的是GNU sed,因此是支持GNU擴展的。

GNU擴展的sed,支持特殊序列(special sequence),它由一個反斜線和一個字母組成:

  • \L:將replacement替換成小寫直到遇到\U或者\E。
  • \l:將下一個字符替換成小寫。
  • \U:將replacement替換成大寫直到遇到\L或者\E。
  • \u:將下一個字符替換成大寫。
  • \E:停止\U或者\L帶來的大小寫轉換功能。
[root@C7 tmp]# sed 's/my/\Uyour/' my.txt This is YOUR cat, my cat's name is betty This is YOUR dog, my dog's name is frank This is YOUR fish, my fish's name is george This is YOUR goat, my goat's name is adam [root@C7 tmp]# sed 's/my/\uyo\uur/' my.txt This is YoUr cat, my cat's name is betty This is YoUr dog, my dog's name is frank This is YoUr fish, my fish's name is george This is YoUr goat, my goat's name is adam [root@C7 tmp]# sed 's/my/\Uyou\Er/' my.txt This is YOUr cat, my cat's name is betty This is YOUr dog, my dog's name is frank This is YOUr fish, my fish's name is george This is YOUr goat, my goat's name is adam

flags:文本替換專屬的標記,用于改變替換的一些行為。

部分標記和命令是同一個字母,要根據字母出現的位置來判斷是標記或者命令。

g:global,全局替換,默認情況下,s命令只替換行內第一個匹配的regexp,使用該選項將替換所有。

[root@C7 tmp]# sed 's/my/your/g' my.txt This is your cat, your cat's name is betty This is your dog, your dog's name is frank This is your fish, your fish's name is george This is your goat, your goat's name is adam

number:標記可以是一個數字,表示替換第幾個匹配的regexp,默認是1。

[root@C7 tmp]# sed 's/my/your/2' my.txt This is my cat, your cat's name is betty This is my dog, your dog's name is frank This is my fish, your fish's name is george This is my goat, your goat's name is adam

對于GNU sed來說,g和number可以結合使用,表示從number位置開始替換至最后一個。

[root@C7 tmp]# cat sed_replace_flags.txt a a a a a a [root@C7 tmp]# sed 's/a/b/3g' sed_replace_flags.txt a a b b b b

p:替換成功則打印。默認情況下,替換成功后會打印所有模式空間中的數據,如果我們結合-n選項和p標記的話,就可以只顯示替換成功后的行。

[root@C7 tmp]# sed -n 's/dog/gouzi/p' my.txt This is my gouzi, my dog's name is frank

i或者I:在匹配regexp的時候,忽略大小寫。

w filename:替換成功的時候,把結果輸出到文件。支持2個特殊文件,/dev/stderr和/dev/stdout。

[root@C7 tmp]# sed -n 's/my/your/gw change.txt' my.txt [root@C7 tmp]# cat change.txt This is your cat, your cat's name is betty This is your dog, your dog's name is frank This is your fish, your fish's name is george This is your goat, your goat's name is adam

?

高級使用

高級使用主要涉及到sed的多行模式(multi-line mode),即模式空間中會存在多行的數據。需要理解上文提到的【工作原理】。

這塊難度比較大,我自己也不太會用。平時使用中更多的還是善用正則實現sed的簡單替換。

因此只這里列出多行模式相關的命令翻譯。

g:使用保持空間的數據替換模式空間。

G:向模式空間追加一個換行,然后將保持空間的數據追加至模式空間。

h:使用模式空間的數據替換保持空間。

H:向保持空間追加一個換行,然后將模式空間的數據追加至保持空間。

x:將模式空間和保持空間的數據互換。

?

轉載于:https://www.cnblogs.com/alongdidi/p/sed.html

總結

以上是生活随笔為你收集整理的Linux文本处理三剑客之sed的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av在线三区 | 劲爆欧美第一页 | 91精品免费在线观看 | 国产免费av片在线观看 | 怡春院国产 | 十八禁视频网站在线观看 | 爱草在线视频 | 亚洲天堂网在线观看视频 | 国产亚洲成av人在线观看导航 | 欧美日韩一区二区三区不卡视频 | 老熟妇一区二区三区 | 制服丝袜一区在线 | 黄色综合网 | 好吊妞这里只有精品 | a视频在线看 | 欧美日韩激情在线一区二区三区 | 三级网站在线免费观看 | 性xxxx视频 | 中日毛片| 中年夫妇啪啪高潮 | 非洲黄色片 | 夜夜骚视频 | 日韩在线专区 | 日本丰满少妇做爰爽爽 | 九七人人爽 | 日韩亚洲精品在线 | 久久久午夜影院 | 在线久草 | 涩涩视频在线播放 | 精品亚洲成人 | 欧美 日韩 国产精品 | 亚洲视频精品在线观看 | 亚洲av成人一区二区 | 99re在线视频 | 日日骚网 | 可以免费观看的毛片 | 夜夜艹| 欧美草逼网 | 鬼灭之刃柱训练篇在线观看 | 丁香久久婷婷 | 免费观看高清在线 | 96福利视频| 99热偷拍 | 国产精品美女av | 综合成人在线 | 中文字幕第一页在线视频 | 草草影院欧美 | 亚洲av无码乱码国产精品 | 久久久久成人精品免费播放动漫 | av一级黄色 | 日韩欧美一区二区在线观看 | 日本电车痴汉 | www.好了av.com | 国内av自拍| 亚洲欧美视频二区 | 国产精品久久久久久吹潮 | 欧美一二在线 | 欧美壮男野外gaytube | 国产精品久久久久电影 | 精品一区二区三区四区五区 | 殴美毛片 | 国产日韩网站 | 国产毛片久久久久 | 尤物视频免费在线观看 | 欧美一区亚洲 | 欧美日韩一区精品 | 久久爱成人 | 自拍偷自拍亚洲精品播放 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 日韩高清国产一区在线 | 色综合视频网 | 国产精品二区在线观看 | 另类视频在线观看+1080p | 九色国产视频 | 中文字幕最新 | 精品国产乱码久久久久久久 | 亚洲黄色片在线观看 | 色亚洲成人 | 成人午夜视频免费观看 | 无码av天堂一区二区三区 | 成人性生交大免费看 | 超碰最新网址 | 亚洲小视频 | 国内精品久久久久 | 久久久久一区二区精码av少妇 | 97中文字幕在线观看 | 91成人综合 | 91看视频| 精品一区二区三区在线观看视频 | 婷婷丁香综合网 | 成人免费短视频 | 一本大道熟女人妻中文字幕在线 | 成人区人妻精品一区二区不卡视频 | 日韩激情网站 | 久久久久久久亚洲精品 | 黄色一级视频免费观看 | 爱啪啪影视 | 丝袜人妻一区二区三区 | 在线看av网址 |