0

このステートメントから日付のみを取り出す grep または sed ステートメントが必要です。

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' 

したがって、答えは次のようになります。

12-Dec-13 11-Jan-12

を取得するのに十分な距離を取得しまし12-Dec-13 asdasd asdf 11-Jan-12たが、日付間のコンテンツを削除できません。sed ステートメントを使用して、スペースを使用して最初の単語と最後の単語を保持し、どちらが最後の単語かを示すことは可能ですか? 結果は変わらないはずです。

4

10 に答える 10

3

POSIX 文字クラスを使用する

POSIX 文字クラスのセットは、目的のテキストに一致します。例えば:

\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b

サンプル入力/出力

次のパイプラインは、GNU Grep を使用して関連するテキストのみを抽出し、日付を連結します。

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' |
    grep -Eo '\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b' |
    xargs
12-Dec-13 11-Jan-12
于 2013-01-17T04:54:00.290 に答える
1
 grep -o "[0-9]\{2\}-[^0-9]\{3\}-[^a-z]\{2\}" file | sed "N;s/\n/ /g"

2013 年 12 月 12 日 2012 年 1 月 11 日

于 2013-01-17T13:38:18.313 に答える
1

これを試してください:

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd'  | sed 's: :\n:g' | grep ^[0-9]
于 2013-02-12T23:53:33.113 に答える
0

一方通行:

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\(..-...-..\).*\(..-...-..\).*/\1 \2/'
12-Dec-13 11-Jan-12

数字とアルファベットの検索パターンをより具体的にするには:

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*/\1 \2/'
12-Dec-13 11-Jan-12
于 2013-01-17T04:45:09.353 に答える
0

以下を使用

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/ /\n/g' |grep '-' | tr -d '\n' |sed 's/$/ \n/g'

出力は

1311 年 12 月 12 日 - 2012 年 1 月

于 2013-01-17T04:48:00.307 に答える
0

日付が愚かにフォーマットされたアクセスログがありました:[30/Jun/2013:08:00:45 +0200]

しかし、次のように表示する必要がありました:30/Jun/2013 08:00:45

問題は、grep ステートメントで「OR」を使用すると、2 行に分かれた 2 つの一致式を受け取っていたことです。

解決策は次のとおりです。

grep -in myURL_of_interest *access.log | \ grep -Eo '(\b[[:digit:]]{2}/[[:upper:]][[:lower:]]{2}/[[:digit:]]{4}|[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\b)' \ | paste - - -d" " > MyAccess.log

私はそれが役立つことを願っています:)

于 2015-07-15T11:01:52.010 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r 'H;g;:a;s/\s*\n$//;t;s/\n(..-...-..)\b/\1 \n/;ta;s/\n([^0-9]+)/\n/;ta' file
于 2013-01-17T14:17:53.713 に答える
0

私は提案してdate -dいます。したがって、日付も検証されます。

$ cat string 
asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd

$ for i in `cat string`; do date -d $i &>/dev/null && echo $i; done
12-Dec-13
11-Jan-12
于 2013-01-17T07:13:28.747 に答える
0
perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'

テスト済み:

> echo 'asdfdsfa 12-Dec-13 asdf 11-Jan-12 asdasd' | perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'
12-Dec-13 11-Jan-12
于 2013-01-17T06:22:35.473 に答える
0

awkで試してください

awk '{for(i=1; i<NF; ++i){if ($i ~ /[0-9]+[-\w]*/) print $i}}' temp.txt

任意の数の行と列で動作します

于 2013-01-17T05:27:00.717 に答える