2012-09-05 4 views
5

Centos/Linux Bashsed: khối lượng chuyển đổi kỷ nguyên giữa ngẫu nhiên văn bản khác

Tôi có một tập tin nhật ký, trong đó có rất nhiều văn bản trong và số kỷ nguyên ở khắp mọi nơi. Tôi muốn thay thế tất cả các kỷ nguyên bất cứ nơi nào họ đang vào ngày/thời gian có thể đọc được.

Tôi đã muốn điều này thông qua sed, vì đó dường như là công cụ cho công việc. Tôi dường như không thể lấy phần thay thế của sed để phân tích cú pháp biến (epoch) thành biến đổi.

Mẫu những gì tôi đang làm việc với ...

echo "Some stuff 1346474454 And not working" \ 
| sed 's/1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/'"`bpdbm -ctime \&`"'/g' 
Some stuff 0 = Thu Jan 1 01:00:00 1970 And not working 

Phần bpdbm ​​sẽ chuyển đổi một biến thời đại cung cấp vào ngày hữu ích. Như thế này ..

bpdbm -ctime 1346474454 
1346474454 = Sat Sep 1 05:40:54 2012 

Vậy làm thế nào để tôi nhận được mục "tìm thấy" được phân tích cú pháp thành lệnh. Vì tôi dường như không thể làm cho nó hoạt động được.

Mọi trợ giúp đều đáng yêu. Nếu có một cách khác, đó sẽ là mát mẻ ... nhưng tôi nghi ngờ sed sẽ nhanh nhất.

Cảm ơn bạn đã dành thời gian!

+0

chạy lệnh này bằng 'set -vx' để xem tại sao nó không hoạt động.Sed phải xử lý các dòng dữ liệu trước khi nó "biết" giá trị của '&', các cmd-subtitution sẽ phải được trì hoãn cho đến khi điều cuối cùng, nhưng nó có khả năng điều đầu tiên nhận được proccessed. Bạn có thể làm điều này dễ dàng trong awk. Niềm tin của bạn trong sed là cảm động ;-). Chúc may mắn! – shellter

+0

Vâng, vâng ... muốn thử và giữ im lặng và lúng túng khi có thể. Sẽ có một vở kịch khác với Sed ngày mai, tôi đã không từ bỏ một giải pháp dựa trên sed – user1649704

Trả lời

7

mà dường như các công cụ cho công việc

Không, nó không phải là. sed chỉ có thể sử dụng &, không có cách nào làm cho nó trở thành đối số cho lệnh. Bạn cần thứ gì đó mạnh mẽ hơn, ví dụ: Perl:

perl -pe 'if (($t) = /(1[0-9]+)/) { s/$t/localtime($t)/e }' 
+0

Điều đó hoạt động tuyệt vời, cảm ơn !! – user1649704

+0

Điều đó làm việc hoàn hảo đối với tôi để phân tích cú pháp XML có thời gian thời gian thành con người có thể đọc được: 'cat inputfile.xml | perl -pe 'if (($ t) =/(1 [0-9] +) /) {s/$ t/giờ địa phương ($ t)/e}'> outputfile.xml' – zedix

1

Bạn có thể làm điều đó với GNU sed, đầu vào:

infile

Some stuff 1346474454 And not working 

GNU sed hỗ trợ /e tham số cho phép cho đầu ra lệnh đường ống vào không gian mô hình, một cách tận dụng điều này với bpdbm:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(bpdbm -ctime \2) \3/e' infile 

Hoặc với coreutilsdate:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(date -d @\2) \3/e' infile 

đầu ra với ngày

Some stuff Sat Sep 1 06:40:54 CEST 2012 And not working 

Để có được kết quả tương tự như với bpdbm:

sed 's/(.*)(1[0-9]{9})(.*)/echo "\1$(date -d @\2 +\"%a %b %_d %T %Y\")\3"/e' infile 

đầu ra

Some stuff Sat Sep 1 06:40:54 2012 And not working 

Lưu ý, điều này chỉ thay thế kỷ nguyên cuối cùng được tìm thấy trên một dòng. Chạy lại nếu có nhiều hơn.